root/as3/FLARToolKit/trunk/libs/Papervision3D/src/org/papervision3d/objects/parsers/SketchupCollada.as

リビジョン 3288, 20.7 kB (コミッタ: rokubou, コミット時期: 3 年 前)

Add Papervison3D.

Line 
1 package org.papervision3d.objects.parsers
2 {
3         import flash.events.Event;
4         import flash.events.IOErrorEvent;
5         import flash.events.ProgressEvent;
6         import flash.events.SecurityErrorEvent;
7         import flash.net.URLLoader;
8         import flash.net.URLRequest;
9        
10         import org.papervision3d.core.geom.TriangleMesh3D;
11         import org.papervision3d.core.geom.renderables.Triangle3D;
12         import org.papervision3d.core.geom.renderables.Vertex3D;
13         import org.papervision3d.core.log.PaperLogger;
14         import org.papervision3d.core.math.Matrix3D;
15         import org.papervision3d.core.math.NumberUV;
16         import org.papervision3d.core.proto.DisplayObjectContainer3D;
17         import org.papervision3d.core.proto.GeometryObject3D;
18         import org.papervision3d.core.proto.MaterialObject3D;
19         import org.papervision3d.events.FileLoadEvent;
20         import org.papervision3d.materials.BitmapFileMaterial;
21         import org.papervision3d.materials.utils.MaterialsList;
22         import org.papervision3d.objects.DisplayObject3D;
23        
24         /**
25         * The Collada class lets you load and parse Collada scenes.
26         * <p/>
27         * Recommended DCC Settings:
28         * <ul><li><b>Maya</b>:
29         * <ul><li>General Export Options
30         * <ul><li>Relative Paths, Triangulate.</li></ul>
31         * <li>Filter Export
32         * <ul><li>Polygon meshes, Normals, Texture Coordinates.</li></ul>
33         * </li></ul>
34         * <li><b>3DS Max</b>:
35         * <ul><li>Standard Options
36         * <ul><li>Relative Paths.</li></ul>
37         * <li>Geometry
38         * <ul><li>Normals, Triangulate.</li></ul>
39         * </li></ul>
40         */
41         public class SketchupCollada extends DisplayObject3D
42         {
43                 /**
44                 * Default scaling value for constructor.
45                 */
46                 static public var DEFAULT_SCALING  :Number = 1;
47        
48                 /**
49                 * Internal scaling value.
50                 */
51                 static private var INTERNAL_SCALING :Number = 100;
52        
53                 /**
54                 * Whether or not the scene has been loaded.
55                 */
56                 public var loaded :Boolean;
57                
58                 public var materialsToLoad:int =0;
59        
60                 // ___________________________________________________________________________________________________
61                 //                                                                                               N E W
62                 // NN  NN EEEEEE WW    WW
63                 // NNN NN EE     WW WW WW
64                 // NNNNNN EEEE   WWWWWWWW
65                 // NN NNN EE     WWW  WWW
66                 // NN  NN EEEEEE WW    WW
67        
68                 /**
69                 * Creates a new Collada object.
70                 * <p/>
71                 * The Collada class lets you load and parse a Collada scene.
72                 * <p/>
73                 * COLLADA is a COLLAborative Design Activity for establishing an interchange file format for interactive 3D applications.
74                 * <p/>
75                 * COLLADA defines an open standard XML schema for exchanging digital assets among various container software applications that might otherwise store their assets in incompatible formats.
76                 * <p/>
77                 * COLLADA documents that describe digital assets are XML files, usually identified with a .dae (digital asset exchange) filename extension.
78                 * <p/>
79                 * @param        COLLADA         An XML COLLADA object or the filename of the .dae scene to load.
80                 * <p/>
81                 * @param        materials       A MaterialsList object.
82                 * <p/>
83                 * @param        scale           Scaling factor.
84                 * <p/>
85                 */
86        
87                 public function SketchupCollada( COLLADA :*, materials :MaterialsList=null, scale :Number=1 )
88                 {
89                         super(null, null);
90                        
91                         this._materials = materials || new MaterialsList();
92        
93                         this._container = this;
94                         this.loaded = false;
95        
96                         this._scaling  = scale || DEFAULT_SCALING;
97                         this._scaling *= INTERNAL_SCALING;
98        
99                         this._geometries = new Object();
100        
101                         if( COLLADA is XML )
102                         {
103                                 this.COLLADA = COLLADA;
104                                 this._filename = "";
105                                 buildCollada();
106                         }
107                         else if( COLLADA is String )
108                         {
109                                 this._filename = COLLADA;
110                                 loadCollada();
111                         }
112                 }
113        
114                 // _______________________________________________________________________ PRIVATE
115        
116                 private function loadCollada():void
117                 {
118                         this._loader = new URLLoader();
119                         this._loader.addEventListener( Event.COMPLETE, onComplete );
120                         this._loader.addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
121                         this._loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSecurityLoadError);
122                         this._loader.addEventListener( ProgressEvent.PROGRESS, handleLoadProgress );
123                         this._loader.load( new URLRequest( this._filename ) );
124                 }
125                
126                 private function handleLoadProgress( e:ProgressEvent ):void
127                 {
128                         var progressEvent:FileLoadEvent = new FileLoadEvent( FileLoadEvent.LOAD_PROGRESS, this._filename, e.bytesLoaded, e.bytesTotal);
129                         dispatchEvent( progressEvent );
130                 }
131                
132                 private function handleIOError(e:IOErrorEvent):void
133                 {
134                         PaperLogger.error("COLLADA file load error", e.text);
135                         dispatchEvent(new FileLoadEvent(FileLoadEvent.LOAD_ERROR,this._filename,0,0,e.text));
136                 }
137                
138                 private function handleSecurityLoadError(e:SecurityErrorEvent):void
139                 {
140                         PaperLogger.error("COLLADA file security load error", e.text);
141                         dispatchEvent(new FileLoadEvent(FileLoadEvent.SECURITY_LOAD_ERROR,this._filename, 0, 0, e.text));
142                 }
143                
144                 private function onComplete(evt:Event):void
145                 {
146                         this.COLLADA = new XML( this._loader.data );
147        
148                         buildCollada();
149                 }
150        
151                 // _______________________________________________________________________
152        
153        
154                 private function buildCollada():void
155                 {
156                         //Reset the number of materials to load.
157                         materialsToLoad = 0;
158                        
159                         default xml namespace = COLLADA.namespace();
160        
161                         // Get up axis
162                         this._yUp = (COLLADA.asset.up_axis == "Y_UP");
163        
164                         // Parse first scene
165                         var sceneId:String = getId( COLLADA.scene.instance_visual_scene.@url );
166        
167                         var scene:XML = COLLADA.library_visual_scenes.visual_scene.(@id == sceneId)[0];
168        
169                         parseScene( scene );
170        
171                         var fileEvent:FileLoadEvent = new FileLoadEvent( FileLoadEvent.LOAD_COMPLETE, _filename );
172                         this.dispatchEvent( fileEvent );
173        
174                         this.loaded = true;
175                        
176                 }
177        
178        
179                 // _______________________________________________________________________ parseScene
180        
181                 private function parseScene( scene:XML ):void
182                 {
183                         for each( var node:XML in scene.node )
184                                 parseNode( node, this._container );
185                 }
186        
187                 // _______________________________________________________________________ parseNode
188        
189                 private function parseNode( node:XML, parent:DisplayObjectContainer3D ):void
190                 {
191                         var matrix :Matrix3D = Matrix3D.IDENTITY;
192        
193                         //if( ! this._yUp && parent == this._container )
194                         //{
195                                 //matrix = Matrix3D.rotationX( Math.PI/2 );
196                                 //matrix = Matrix3D.multiply( matrix, Matrix3D.rotationZ( Math.PI ) );
197                         //}
198        
199                         var newNode:DisplayObject3D;
200        
201                         if( String( node.instance_geometry ) == "" )
202                                 newNode = new DisplayObject3D( node.@name );
203                         else
204                                 newNode = new TriangleMesh3D( null, null, null, node.@name );
205        
206        
207                         var instance :DisplayObject3D = parent.addChild( newNode, node.@name );
208        
209                         var children      :XMLList  = node.children();
210                         var totalChildren :int      = children.length();
211        
212                         for( var i:int = 0; i < totalChildren; i++ )
213                         {
214                                 var child:XML = children[i];
215        
216                                 switch( child.name().localName )
217                                 {
218                                         case "translate":
219                                                 matrix = Matrix3D.multiply( matrix, translateMatrix( getArray( child ) ) );
220                                                 break;
221        
222                                         case "rotate":
223                                                 matrix = Matrix3D.multiply( matrix, rotateMatrix( getArray( child ) ) );
224                                                 break;
225        
226                                         case "scale":
227                                                 matrix = Matrix3D.multiply( matrix, scaleMatrix( getArray( child ) ) );
228                                                 break;
229        
230                                         // Baked transform matrix
231                                         case "matrix":
232                                                 matrix = Matrix3D.multiply( matrix, bakedMatrix( new Matrix3D( getArray( child ) ) ) );
233                                                 break;
234        
235                                         case "node":
236                                                 if(String(child).indexOf("ForegroundColor")==-1) parseNode( child, instance );
237                                                 //••••••••••••••••••••••••••••••••••••••••••••••
238                                                 break;
239        
240                                         case "instance_geometry":
241        
242                                                 // Instance materials
243                                                 if(String(child).indexOf("lines")==-1) {
244                                                 //••••••••••••••••••••••••••••••••••••••
245                                                         var bindMaterial:Object = new Object();
246                                                         for each( var instance_material:XML in child..instance_material )
247                                                         {
248                                                                 bindMaterial[ instance_material.@symbol ] = instance_material.@target.split("#")[1];
249                                                         }
250                
251                                                         // Instance geometry
252                                                         for each( var geometry:XML in child )
253                                                         {
254                                                                 var geoId:String = getId( geometry.@url );
255                                                                 var geo:XML = COLLADA.library_geometries.geometry.(@id == geoId)[0];
256                                                                 parseGeometry( geo, instance, Matrix3D.clone( matrix ), bindMaterial );
257                                                         }
258                                                 }
259                                          //•••
260                                                 break;
261                                 }
262                         }
263        
264                         instance.copyTransform( matrix );
265                 }
266        
267                 // _______________________________________________________________________ parseGeometry
268        
269                 private function parseGeometry( geometry:XML, instance:DisplayObject3D, matrix2:Matrix3D=null, bindMaterial:Object=null ):void
270                 {
271                         var matrix:Matrix3D = Matrix3D.clone( matrix2 ) || Matrix3D.IDENTITY; // TODO: Cleanup
272        
273                         // DEBUG
274                         //trace( "parseGeometry: " + geometry.@id ); // DEBUG
275        
276                         // Semantics
277                         var semantics :Object = new Object();
278                         semantics.name = geometry.@id;
279        
280                         var faces:Array = semantics.triangles = new Array();
281        
282                         // Multi material
283                         var multiMaterial:Boolean = (geometry.mesh.triangles.length() > 1);
284        
285                         // Triangles
286                         for each( var triangles:XML in geometry.mesh.triangles )
287                         {
288                                 // Input
289                                 var field:Array = new Array();
290        
291                                 for each( var input:XML in triangles.input )
292                                 {
293                                         semantics[ input.@semantic ] = deserialize( input, geometry );
294                                         field.push( input.@semantic );
295                                 }
296        
297                                 var data     :Array  = triangles.p.split(' ');
298                                 var len      :Number = triangles.@count;
299                                 var material :String = triangles.@material;
300        
301                                 // DEBUG
302                                 //trace( "triangles: " + len );
303                                
304                                 if(material != "FrontColorNoCulling") addMaterial( instance, material, bindMaterial );
305                                 // ••••••••••••••••••••••••••••••••••
306        
307                                 for( var j:Number = 0; j < len; j++ )
308                                 {
309                                         var t:Object = new Object();
310        
311                                         for( var v:Number = 0; v < 3; v++ )
312                                         {
313                                                 var fld:String;
314                                                 for( var k:Number = 0; fld = field[k]; k++ )
315                                                 {
316                                                         if( ! t[ fld ] ) t[ fld ] = new Array();
317        
318                                                         t[ fld ].push( Number( data.shift() ) );
319                                                 }
320        
321                                                 t["material"] = material; //multiMaterial? material : null;
322                                         }
323                                         faces.push( t );
324                                 }
325                         }
326        
327                         buildObject( semantics, instance, matrix );
328                 }
329        
330        
331                 // _______________________________________________________________________ buildObject
332        
333        
334                 private function buildObject( semantics:Object, instance:DisplayObject3D, matrix:Matrix3D=null ):void
335                 {
336                         matrix = matrix || Matrix3D.IDENTITY;
337        
338         //              var mesh :Mesh3D = new Mesh3D( null, new Array(), new Array() )
339                         instance.addGeometry( new GeometryObject3D() );
340        
341                         // Vertices
342                         var vertices :Array    = instance.geometry.vertices = new Array();
343                         var scaling  :Number   = this._scaling;
344                         var accVerts :Number   = vertices.length;
345        
346                         var semVertices :Array = semantics.VERTEX;
347                         var len:Number = semVertices.length;
348        
349                         // DEBUG
350                         //trace( "Vertices: " + len );
351        
352                         var i:int;
353                         for( i=0; i < len; i++ )
354                         {
355                                 // Swap z & y for Max (to make Y up and Z depth)
356                                 var vert:Object = semVertices[ i ];
357                                 var x :Number = Number( vert.X ) * scaling;
358                                 var y :Number = Number( vert.Y ) * scaling;
359                                 var z :Number = Number( vert.Z ) * scaling;
360        
361                                 if( this._yUp )
362                                         vertices.push( new Vertex3D( -x, y, z ) );
363                                 else
364                                         vertices.push( new Vertex3D(  x, z, y ) );
365                         }
366        
367                         // Faces
368                         var faces    :Array = instance.geometry.faces = new Array();
369                         var semFaces :Array = semantics.triangles;
370                         len = semFaces.length;
371        
372                         // DEBUG
373                         //trace( "Faces: " + len );
374        
375                         for( i=0; i < len; i++ )
376                         {
377                                 // Triangle
378                                 var tri :Array = semFaces[i].VERTEX;
379                                 var a   :Vertex3D = vertices[ accVerts + tri[ 0 ] ];
380                                 var b   :Vertex3D = vertices[ accVerts + tri[ 1 ] ];
381                                 var c   :Vertex3D = vertices[ accVerts + tri[ 2 ] ];
382        
383                                 var faceList :Array = [ a, b, c ];
384        
385                                 var tex :Array = semantics.TEXCOORD;
386                                 var uv  :Array = semFaces[i].TEXCOORD;
387        
388                                 var uvList :Array, uvA :NumberUV, uvB :NumberUV, uvC :NumberUV;
389        
390                                 if( uv && tex )
391                                 {
392                                         uvA = new NumberUV( tex[ uv[0] ].S, tex[ uv[0] ].T );
393                                         uvB = new NumberUV( tex[ uv[1] ].S, tex[ uv[1] ].T );
394                                         uvC = new NumberUV( tex[ uv[2] ].S, tex[ uv[2] ].T );
395        
396                                         uvList = [ uvA, uvB, uvC ];
397                                 }
398                                 else uvList = null;
399
400                                 var materialName:String = semFaces[i].material || null;
401                                 var face:Triangle3D = new Triangle3D(instance, faceList, _materials.getMaterialByName(materialName), uvList );
402
403                                 faces.push( face );
404                         }
405                        
406        
407                         // Activate object
408                         instance.geometry.ready = true;
409        
410                         matrix.n14 *= scaling;
411                         matrix.n24 *= scaling;
412                         matrix.n34 *= scaling;
413        
414                         instance.material = MaterialObject3D.DEFAULT;
415        
416                         instance.visible  = true;
417                 }
418        
419        
420                 private function getArray( spaced:String ):Array
421                 {
422                         var strings :Array = spaced.split(" ");
423                         var numbers :Array = new Array();
424        
425                         var totalStrings:Number = strings.length;
426        
427                         for( var i:Number=0; i < totalStrings; i++ )
428                                 numbers[i] = Number( strings[i] );
429        
430                         return numbers;
431                 }
432        
433        
434                 private function addMaterial( instance:DisplayObject3D, name:String, bindMaterial:Object ):void
435                 {
436                         //trace( "Collada: addMaterial: " + instance.name + " > " + name ); // DEBUG
437                         var material:MaterialObject3D;
438                        
439                         if( this._materials ){
440                                 material = this._materials.getMaterialByName( name );
441                         }else{
442                                 _materials = new MaterialsList();
443                         }
444                        
445                         if( ! material )
446                         {
447                                 // Find object path
448                                 var path :String = this._filename.slice( 0, this._filename.lastIndexOf("/") +1 );
449        
450                                 // Retrieve texture url
451                                 var filename :String = getTexture( bindMaterial[name] );
452        
453                                 if( filename )
454                                 {
455                                         // Load relative to the object
456                                         materialsToLoad++;
457                                         material = new BitmapFileMaterial( path + filename );
458                                         material.addEventListener(FileLoadEvent.LOAD_COMPLETE, onMaterialLoadComplete);
459                                         material.addEventListener(FileLoadEvent.LOAD_ERROR, onMaterialLoadError);
460                                 }
461                                 else
462                                 {
463                                         material = MaterialObject3D.DEFAULT;
464                                         PaperLogger.warning( "Collada material " + name + " not found." );
465                                 }
466        
467                                 material.name = name;
468                         }
469                         _materials.addMaterial(material);
470        
471                         if( ! instance.materials ) instance.materials = new MaterialsList();
472                        
473                         instance.materials.addMaterial( material, name );
474                 }
475                
476                 private function onMaterialLoadComplete(event:FileLoadEvent):void
477                 {
478                         materialsToLoad--;
479                         if(materialsToLoad == 0){
480                                 materials = new MaterialsList();
481                                 dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE));
482                         }
483                 }
484                
485                 private function onMaterialLoadError(event:FileLoadEvent):void
486                 {
487                         var mat:BitmapFileMaterial = event.target as BitmapFileMaterial;
488                         PaperLogger.error("Colllada failed to load material : " +mat);
489                         //Do error handling here.
490                         materialsToLoad--;
491                         if(materialsToLoad == 0){
492                                 dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE));
493                         }
494                 }
495        
496        
497                 // Retrieves the filename of a material
498                 private function getTexture( name:String ):String
499                 {
500                         var filename :String = null;
501        
502                         var material:XML = COLLADA.library_materials.material.(@id == name)[0];
503        
504                         if( material )
505                         {
506                                 var effectId:String = getId( material.instance_effect.@url );
507                                 var effect:XML = COLLADA.library_effects.effect.(@id == effectId)[0];
508        
509                                 if (effect..texture.length() == 0) return null;
510        
511                                 var textureId:String = effect..texture[0].@texture;
512        
513                                 var sampler:XML =  effect..newparam.(@sid == textureId)[0];
514        
515                                 // Blender
516                                 var imageId:String = textureId;
517        
518                                 // Not Blender
519                                 if( sampler )
520                                 {
521                                         var sourceId:String = sampler..source[0];
522                                         var source:XML =  effect..newparam.(@sid == sourceId)[0];
523        
524                                         imageId = source..init_from[0];
525                                 }
526        
527                                 var image:XML = COLLADA.library_images.image.(@id == imageId)[0];
528        
529                                 filename = image.init_from;
530        
531                                 if (filename.substr(0, 2) == "./")
532                                 {
533                                         filename = filename.substr( 2 );
534                                 }
535                         }
536        
537                         return filename;
538                 }
539        
540        
541                 // _______________________________________________________________________
542                 //                                                                Matrices
543        
544                 private function rotateMatrix( vector:Array ):Matrix3D
545                 {
546                         if( this._yUp )
547                                 return Matrix3D.rotationMatrix( vector[0], vector[1], vector[2], -vector[3] *toRADIANS );
548                         else
549                                 return Matrix3D.rotationMatrix( vector[0], vector[2], vector[1], -vector[3] *toRADIANS );
550                 }
551        
552        
553                 private function translateMatrix( vector:Array ):Matrix3D
554                 {
555                         if( this._yUp )
556                                 return Matrix3D.translationMatrix( -vector[0] *this._scaling, vector[1] *this._scaling, vector[2] *this._scaling );
557                         else
558                                 return Matrix3D.translationMatrix(  vector[0] *this._scaling, vector[2] *this._scaling, vector[1] *this._scaling );
559                 }
560        
561        
562                 private function scaleMatrix( vector:Array ):Matrix3D
563                 {
564                         if( this._yUp )
565                                 return Matrix3D.scaleMatrix( vector[0], vector[1], vector[2] );
566                         else
567                                 return Matrix3D.scaleMatrix( vector[0], vector[2], vector[1] );
568                 }
569        
570                 private function bakedMatrix( matrix:Matrix3D ):Matrix3D
571                 {
572                         matrix.n14 *= _scaling;
573                         matrix.n24 *= _scaling;
574                         matrix.n34 *= _scaling;
575                        
576                         return matrix;
577                 }
578        
579                 // _______________________________________________________________________
580                 //                                                                     XML
581        
582                 private function deserialize( input:XML, geo:XML ):Array
583                 {
584                         var output :Array = new Array();
585                         var id     :String = input.@source.split("#")[1];
586        
587                         // Source?
588                         var acc:XMLList = geo..source.(@id == id).technique_common.accessor;
589        
590                         if( acc != new XMLList() )
591                         {
592                                 // Build source floats array
593                                 var floId  :String  = acc.@source.split("#")[1];
594                                 var floXML :XMLList = COLLADA..float_array.(@id == floId);
595                                 var floStr :String  = floXML.toString();
596                                 var floats :Array   = floStr.split(" ");
597        
598                                 // Build params array
599                                 var params :Array = new Array();
600        
601                                 for each( var par:XML in acc.param )
602                                         params.push( par.@name );
603        
604                                 // Build output array
605                                 var count  :int = acc.@count;
606                                 var stride :int = acc.@stride;
607        
608                                 for( var i:int=0; i < count; i++ )
609                                 {
610                                         var element :Object = new Object();
611        
612                                         for( var j:int=0; j < stride; j++ )
613                                                 element[ params[j] ] = floats.shift();
614        
615                                         //for( j=0; j < stride; j++ ) trace( params[j] + " " + element[ params[j] ] ); // DEBUG
616        
617                                         output.push( element );
618                                 }
619                         }
620                         else
621                         {
622                                 // Store indexes if no source
623                                 var recursive :XMLList = geo..vertices.(@id == id)[INPUTTAG];
624        
625                                 output = deserialize( recursive[0], geo );
626                         }
627        
628                         return output;
629                 }
630        
631                 public function getMaterialsList():MaterialsList
632                 {
633                         return _materials;
634                 }
635        
636                 private function getId( url:String ):String
637                 {
638                         return url.split("#")[1];
639                 }
640        
641                 // _______________________________________________________________________
642                 //                                                       COLLADA tag names
643        
644                 private static var COLLADASECTION  :String = "COLLADA";
645                 private static var LIBRARYSECTION  :String = "library";
646                 private static var ASSETSECTION    :String = "asset";
647                 private static var SCENESECTION    :String = "scene";
648        
649                 private static var LIGHTPREFAB     :String = "light";
650                 private static var CAMERAPREFAB    :String = "camera";
651                 private static var MATERIALSECTION :String = "material";
652                 private static var GEOMETRYSECTION :String = "geometry";
653        
654                 private static var MESHSECTION     :String = "mesh";
655                 private static var SOURCESECTION   :String = "source";
656                 private static var ARRAYSECTION    :String = "array";
657                 private static var ACCESSORSECTION :String = "accessor";
658                 private static var VERTICESSECTION :String = "vertices";
659                 private static var INPUTTAG        :String = "input";
660                 private static var POLYGONSSECTION :String = "polygons";
661                 private static var POLYGON         :String = "p";
662                 private static var NODESECTION     :String = "node";
663                 private static var LOOKATNODE      :String = "lookat";
664                 private static var MATRIXNODE      :String = "matrix";
665                 private static var PERSPECTIVENODE :String = "perspective";
666                 private static var ROTATENODE      :String = "rotate";
667                 private static var SCALENODE       :String = "scale";
668                 private static var TRANSLATENODE   :String = "translate";
669                 private static var SKEWNODE        :String = "skew";
670                 private static var INSTANCENODE    :String = "instance";
671                 private static var INSTACESCENE    :String = "instance_visual_scene";
672        
673                 private static var PARAMTAG        :String = "param";
674        
675                 private static var POSITIONINPUT   :String = "POSITION";
676                 private static var VERTEXINPUT     :String = "VERTEX";
677                 private static var NORMALINPUT     :String = "NORMAL";
678                 private static var TEXCOORDINPUT   :String = "TEXCOORD";
679                 private static var UVINPUT         :String = "UV";
680                 private static var TANGENTINPUT    :String = "TANGENT";
681        
682                 // _______________________________________________________________________
683        
684                 private var COLLADA     :XML;
685                 private var _container  :DisplayObjectContainer3D;
686                 private var _geometries :Object;
687        
688                 private var _loader     :URLLoader;
689        
690                 private var _filename   :String;
691                 private var _materials  :MaterialsList;
692                 private var _scaling    :Number;
693        
694                 private var _yUp        :Boolean;
695        
696                 static private var toDEGREES :Number = 180/Math.PI;
697                 static private var toRADIANS :Number = Math.PI/180;
698         }
699 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。