チェンジセット 1235: as3/AS3D/src

差分発生行の前後
無視リスト:
コミット日時:
2008/09/04 18:10:29 (3 年前)
コミッタ:
muta
ログメッセージ:

Subclipse のテスト

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/AS3D/src/as3d/display/DisplayObject3D.as

    r224 r1235  
    11/** 
    22 * AS3D Library 
    3  *  
     3 * 
    44 * Copyright 2008 (c) muta 
    5  *  
     5 * 
    66 * http://unbland.net/ 
    77 * http://unbland.net/blog/ 
    8  *  
     8 * 
    99 * Licensed under the MIT License 
    1010 * 
     
    2929package as3d.display 
    3030{ 
    31         import as3d.color.*; 
    32         import as3d.geom.*; 
    33         import as3d.ns.as3d_internal; 
    34         import flash.display.BitmapData; 
    35         import flash.errors.IllegalOperationError; 
    36         import flash.events.EventDispatcher; 
    37         import flash.utils.describeType; 
    38          
    39         use namespace as3d_internal; 
    40          
    41         public class DisplayObject3D extends EventDispatcher 
    42         { 
    43                 private var _x:Number = 0; 
    44                 private var _y:Number = 0; 
    45                 private var _z:Number = 0; 
    46                  
    47                 private var _scale:Number = 1; 
    48                 private var _scaleX:Number = 1; 
    49                 private var _scaleY:Number = 1; 
    50                 private var _scaleZ:Number = 1; 
    51                  
    52                 private var _rotationX:Number = 0; 
    53                 private var _rotationY:Number = 0; 
    54                 private var _rotationZ:Number = 0; 
    55                  
    56                 private var _visible:Boolean = true; 
    57                 private var _doubleSide:Boolean = false; 
    58                  
    59                 private var _position:Vector3D; 
    60                  
    61                 private var _color:ColorRGB; 
    62                 private var _diffuse:VectorRGB; 
    63                  
    64                 private var _texture:BitmapData; 
    65                  
    66                 private var _shadingType:String = ShadingType.NONE; 
    67                  
    68                 private var _transformMatrix:Matrix3D; 
    69                  
    70                 private var _va:Vector3D; 
    71                 private var _vb:Vector3D; 
    72                  
    73                 protected var _vertices:Array = []; 
    74                 protected var _surfaces:Array = []; 
    75                  
    76                 protected const PI:Number = Math.PI; 
    77                 protected const TO_RADIAN:Number = PI / 180; 
    78                 protected const TO_DEGREE:Number = 180 / PI; 
    79                  
    80                 public function DisplayObject3D():void 
    81                 { 
    82                         var className:String = String(describeType(this).@name).match(/::(.*)/)[1]; 
    83                          
    84                         if (className == "DisplayObject3D") 
    85                         { 
    86                                 throw new IllegalOperationError( 
    87                                         "DisplayObject3D は抽象クラスのため、直接インスタンス化できません。"); 
    88                         } 
    89                          
    90                         _position = new Vector3D(); 
    91                         _transformMatrix = new Matrix3D(); 
    92                          
    93                         _color = new ColorRGB(255, 255, 255); 
    94                         _diffuse = new VectorRGB(1, 1, 1); 
    95                          
    96                         _va = new Vector3D(); 
    97                         _vb = new Vector3D(); 
    98                 } 
    99                  
    100                 /** 
    101                  * このオブジェクトの x 値です。 
    102                  */ 
    103                 public function get x():Number 
    104                 { 
    105                         return _x; 
    106                 } 
    107                  
    108                 public function set x(value:Number):void 
    109                 { 
    110                         _x = _position.x = value; 
    111                 } 
    112                  
    113                 /** 
    114                  * このオブジェクトの y 値です。 
    115                  */ 
    116                 public function get y():Number 
    117                 { 
    118                         return _y; 
    119                 } 
    120                  
    121                 public function set y(value:Number):void 
    122                 { 
    123                         _y = _position.y = value; 
    124                 } 
    125                  
    126                 /** 
    127                  * このオブジェクトの z 値です。 
    128                  */ 
    129                 public function get z():Number 
    130                 { 
    131                         return _z; 
    132                 } 
    133                  
    134                 public function set z(value:Number):void 
    135                 { 
    136                         _z = _position.z = value; 
    137                 } 
    138                  
    139                 /** 
    140                  * このオブジェクトの scale 値です。 
    141                  */ 
    142                 public function get scale():Number 
    143                 { 
    144                         return _scale; 
    145                 } 
    146                  
    147                 public function set scale(value:Number):void 
    148                 { 
    149                         _scale = _scaleX = _scaleY = _scaleZ = value; 
    150                 } 
    151                  
    152                 /** 
    153                  * このオブジェクトの scaleX 値です。 
    154                  */ 
    155                 public function get scaleX():Number 
    156                 { 
    157                         return _scaleX; 
    158                 } 
    159                  
    160                 public function set scaleX(value:Number):void 
    161                 { 
    162                         _scaleX = value; 
    163                 } 
    164                  
    165                 /** 
    166                  * このオブジェクトの scaleY 値です。 
    167                  */ 
    168                 public function get scaleY():Number 
    169                 { 
    170                         return _scaleY; 
    171                 } 
    172                  
    173                 public function set scaleY(value:Number):void 
    174                 { 
    175                         _scaleY = value; 
    176                 } 
    177                  
    178                 /** 
    179                  * このオブジェクトの scaleZ 値です。 
    180                  */ 
    181                 public function get scaleZ():Number 
    182                 { 
    183                         return _scaleZ; 
    184                 } 
    185                  
    186                 public function set scaleZ(value:Number):void 
    187                 { 
    188                         _scaleZ = value; 
    189                 } 
    190                  
    191                 /** 
    192                  * このオブジェクトの rotationX 値です。 
    193                  */ 
    194                 public function get rotationX():Number 
    195                 { 
    196                         return _rotationX; 
    197                 } 
    198                  
    199                 public function set rotationX(value:Number):void 
    200                 { 
    201                         _rotationX = 
    202                                 (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
    203                 } 
    204                  
    205                 /** 
    206                  * このオブジェクトの rotationY 値です。 
    207                  */ 
    208                 public function get rotationY():Number 
    209                 { 
    210                         return _rotationY; 
    211                 } 
    212                  
    213                 public function set rotationY(value:Number):void 
    214                 { 
    215                         _rotationY = 
    216                                 (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
    217                 } 
    218                  
    219                 /** 
    220                  * このオブジェクトの rotationZ 値です。 
    221                  */ 
    222                 public function get rotationZ():Number 
    223                 { 
    224                         return _rotationZ; 
    225                 } 
    226                  
    227                 public function set rotationZ(value:Number):void 
    228                 { 
    229                         _rotationZ = 
    230                                 (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
    231                 } 
    232                  
    233                 /** 
    234                  * オブジェクトを描画するか否かです。 
    235                  */ 
    236                 public function get visible():Boolean 
    237                 { 
    238                         return _visible; 
    239                 } 
    240                  
    241                 public function set visible(value:Boolean):void 
    242                 { 
    243                         _visible = value; 
    244                 } 
    245                  
    246                 /** 
    247                  * オブジェクトの両面を描画するか否かです。 
    248                  */ 
    249                 public function get doubleSide():Boolean 
    250                 { 
    251                         return _doubleSide; 
    252                 } 
    253                  
    254                 public function set doubleSide(value:Boolean):void 
    255                 { 
    256                         _doubleSide = value; 
    257                          
    258                         for each (var surface:Surface3D in _surfaces) 
    259                         { 
    260                                 surface.doubleSide = _doubleSide; 
    261                         } 
    262                 } 
    263                  
    264                 /** 
    265                  * このオブジェクトの位置をベクトルで表したものです。 
    266                  */ 
    267                 public function get position():Vector3D 
    268                 { 
    269                         return _position; 
    270                 } 
    271                  
    272                 /** 
    273                  * このオブジェクトの色です。 
    274                  */ 
    275                 public function get color():ColorRGB 
    276                 { 
    277                         return _color; 
    278                 } 
    279                  
    280                 public function set color(value:ColorRGB):void 
    281                 { 
    282                         _color = value; 
    283                 } 
    284                  
    285                 /** 
    286                  * 平行光源に対する反射率です。 
    287                  */ 
    288                 public function get diffuse():VectorRGB 
    289                 { 
    290                         return _diffuse; 
    291                 } 
    292                  
    293                 public function set diffuse(value:VectorRGB):void 
    294                 { 
    295                         _diffuse = value; 
    296                 } 
    297                  
    298                 /** 
    299                  * このオブジェクトのテクスチャです。 
    300                  */ 
    301                 public function get texture():BitmapData 
    302                 { 
    303                         return _texture; 
    304                 } 
    305                  
    306                 public function set texture(value:BitmapData):void 
    307                 { 
    308                         _texture = value; 
    309                 } 
    310                  
    311                 /** 
    312                  * このオブジェクトに適用するシェーディングの種類です。 
    313                  */ 
    314                 public function get shadingType():String 
    315                 { 
    316                         return _shadingType; 
    317                 } 
    318                  
    319                 public function set shadingType(value:String):void 
    320                 { 
    321                         _shadingType = value; 
    322                 } 
    323                  
    324                 /** 
    325                  * 頂点が格納された配列です。 
    326                  */ 
    327                 public function get vertices():Array 
    328                 { 
    329                         return _vertices.concat(); 
    330                 } 
    331                  
    332                 /** 
    333                  * 平面が格納された配列です。 
    334                  */ 
    335                 public function get surfaces():Array 
    336                 { 
    337                         return _surfaces.concat(); 
    338                 } 
    339                  
    340                 /** 
    341                  * 指定されたインデックス値の頂点を返します。 
    342                  *  
    343                  * @param 頂点のインデックス値です。 
    344                  */ 
    345                 public function getVertexAt(index:int):Vertex3D 
    346                 { 
    347                         return _vertices[index]; 
    348                 } 
    349                  
    350                 /** 
    351                  * 指定されたインデックス値の平面を返します。 
    352                  *  
    353                  * @param 平面のインデックス値です。 
    354                  */ 
    355                 public function getSurfaceAt(index:int):Surface3D 
    356                 { 
    357                         return _surfaces[index]; 
    358                 } 
    359                  
    360                 /** 
    361                  * このオブジェクトに含まれる平面全てを反転します。 
    362                  */ 
    363                 public function flip():void 
    364                 { 
    365                         for each (var surface:Surface3D in _surfaces) 
    366                         { 
    367                                 surface.flip(); 
    368                         } 
    369                 } 
    370                  
    371                 /** 
    372                  * @private 
    373                  */ 
    374                 as3d_internal function get transformMatrix():Matrix3D 
    375                 { 
    376                         _transformMatrix.identity(); 
    377                          
    378                         _transformMatrix.scale(scaleX, scaleY, scaleZ); 
    379                         _transformMatrix.rotate( 
    380                                 rotationX * TO_RADIAN, 
    381                                 rotationY * TO_RADIAN, 
    382                                 rotationZ * TO_RADIAN); 
    383                         _transformMatrix.translate(x, y, z); 
    384                          
    385                         return _transformMatrix; 
    386                 } 
    387                  
    388                 /** 
    389                  * @private 
    390                  */ 
    391                 protected function addSurface(v1:Vertex3D, v2:Vertex3D, v3:Vertex3D):void 
    392                 { 
    393                         _va.x = v1.x - v2.x; _va.y = v1.y - v2.y; _va.z = v1.z - v2.z; 
    394                         _vb.x = v1.x - v3.x; _vb.y = v1.y - v3.y; _vb.z = v1.z - v3.z; 
    395                          
    396                         _va.cross(_vb); 
    397                         _va.normalize(); 
    398                          
    399                         v1.normal.add(_va); 
    400                         v2.normal.add(_va); 
    401                         v3.normal.add(_va); 
    402                         v1.numUsed++; 
    403                         v2.numUsed++; 
    404                         v3.numUsed++; 
    405                          
    406                         _surfaces.push(new Surface3D(v1, v2, v3, _va.clone(), this)); 
    407                 } 
    408                  
    409                 /** 
    410                  * @private 
    411                  */ 
    412                 protected function endBuild():void 
    413                 { 
    414                         for each (var vertex:Vertex3D in _vertices) 
    415                         { 
    416                                 if (vertex.numUsed > 0) 
    417                                 { 
    418                                         vertex.normal.x /= vertex.numUsed; 
    419                                         vertex.normal.y /= vertex.numUsed; 
    420                                         vertex.normal.z /= vertex.numUsed; 
    421                                          
    422                                         vertex.numUsed = 0; 
    423                                 } 
    424                                  
    425                                 vertex.normal.normalize(); 
    426                         } 
    427                 } 
    428         } 
     31    import as3d.color.*; 
     32    import as3d.geom.*; 
     33    import as3d.ns.as3d_internal; 
     34    import flash.display.BitmapData; 
     35    import flash.errors.IllegalOperationError; 
     36    import flash.events.EventDispatcher; 
     37    import flash.utils.describeType; 
     38 
     39    use namespace as3d_internal; 
     40 
     41    public class DisplayObject3D extends EventDispatcher 
     42    { 
     43        private var _x:Number = 0; 
     44        private var _y:Number = 0; 
     45        private var _z:Number = 0; 
     46 
     47        private var _scale:Number = 1; 
     48        private var _scaleX:Number = 1; 
     49        private var _scaleY:Number = 1; 
     50        private var _scaleZ:Number = 1; 
     51 
     52        private var _rotationX:Number = 0; 
     53        private var _rotationY:Number = 0; 
     54        private var _rotationZ:Number = 0; 
     55 
     56        private var _visible:Boolean = true; 
     57        private var _doubleSide:Boolean = false; 
     58 
     59        private var _position:Vector3D; 
     60 
     61        private var _color:ColorRGB; 
     62        private var _diffuse:VectorRGB; 
     63 
     64        private var _texture:BitmapData; 
     65 
     66        private var _shadingType:String = ShadingType.NONE; 
     67 
     68        private var _transformMatrix:Matrix3D; 
     69 
     70        private var _va:Vector3D; 
     71        private var _vb:Vector3D; 
     72 
     73        protected var _vertices:Array = []; 
     74        protected var _surfaces:Array = []; 
     75 
     76        protected const PI:Number = Math.PI; 
     77        protected const TO_RADIAN:Number = PI / 180; 
     78        protected const TO_DEGREE:Number = 180 / PI; 
     79 
     80        public function DisplayObject3D():void 
     81        { 
     82            var className:String = String(describeType(this).@name).match(/::(.*)/)[1]; 
     83 
     84            if (className == "DisplayObject3D") 
     85            { 
     86                throw new IllegalOperationError( 
     87                    "DisplayObject3D は抽象クラスのため、直接インスタンス化できません。" 
     88                ); 
     89            } 
     90 
     91            _position = new Vector3D(); 
     92            _transformMatrix = new Matrix3D(); 
     93 
     94            _color = new ColorRGB(255, 255, 255); 
     95            _diffuse = new VectorRGB(1, 1, 1); 
     96 
     97            _va = new Vector3D(); 
     98            _vb = new Vector3D(); 
     99        } 
     100 
     101        /** 
     102        * このオブジェクトの x 値です。 
     103        */ 
     104        public function get x():Number 
     105        { 
     106            return _x; 
     107        } 
     108 
     109        public function set x(value:Number):void 
     110        { 
     111            _x = _position.x = value; 
     112        } 
     113 
     114        /** 
     115        * このオブジェクトの y 値です。 
     116        */ 
     117        public function get y():Number 
     118        { 
     119            return _y; 
     120        } 
     121 
     122        public function set y(value:Number):void 
     123        { 
     124            _y = _position.y = value; 
     125        } 
     126 
     127        /** 
     128        * このオブジェクトの z 値です。 
     129        */ 
     130        public function get z():Number 
     131        { 
     132            return _z; 
     133        } 
     134 
     135        public function set z(value:Number):void 
     136        { 
     137            _z = _position.z = value; 
     138        } 
     139 
     140        /** 
     141        * このオブジェクトの scale 値です。 
     142        */ 
     143        public function get scale():Number 
     144        { 
     145            return _scale; 
     146        } 
     147 
     148        public function set scale(value:Number):void 
     149        { 
     150            _scale = _scaleX = _scaleY = _scaleZ = value; 
     151        } 
     152 
     153        /** 
     154        * このオブジェクトの scaleX 値です。 
     155        */ 
     156        public function get scaleX():Number 
     157        { 
     158            return _scaleX; 
     159        } 
     160 
     161        public function set scaleX(value:Number):void 
     162        { 
     163            _scaleX = value; 
     164        } 
     165 
     166        /** 
     167        * このオブジェクトの scaleY 値です。 
     168        */ 
     169        public function get scaleY():Number 
     170        { 
     171            return _scaleY; 
     172        } 
     173 
     174        public function set scaleY(value:Number):void 
     175        { 
     176            _scaleY = value; 
     177        } 
     178 
     179        /** 
     180        * このオブジェクトの scaleZ 値です。 
     181        */ 
     182        public function get scaleZ():Number 
     183        { 
     184            return _scaleZ; 
     185        } 
     186 
     187        public function set scaleZ(value:Number):void 
     188        { 
     189            _scaleZ = value; 
     190        } 
     191 
     192        /** 
     193        * このオブジェクトの rotationX 値です。 
     194        */ 
     195        public function get rotationX():Number 
     196        { 
     197            return _rotationX; 
     198        } 
     199 
     200        public function set rotationX(value:Number):void 
     201        { 
     202            _rotationX = 
     203                (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
     204        } 
     205 
     206        /** 
     207        * このオブジェクトの rotationY 値です。 
     208        */ 
     209        public function get rotationY():Number 
     210        { 
     211            return _rotationY; 
     212        } 
     213 
     214        public function set rotationY(value:Number):void 
     215        { 
     216            _rotationY = 
     217                (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
     218        } 
     219 
     220        /** 
     221        * このオブジェクトの rotationZ 値です。 
     222        */ 
     223        public function get rotationZ():Number 
     224        { 
     225            return _rotationZ; 
     226        } 
     227 
     228        public function set rotationZ(value:Number):void 
     229        { 
     230            _rotationZ = 
     231                (value > 180) ? value - 360 : (value <= -180) ? value + 360 : value; 
     232        } 
     233 
     234        /** 
     235        * オブジェクトを描画するか否かです。 
     236        */ 
     237        public function get visible():Boolean 
     238        { 
     239            return _visible; 
     240        } 
     241 
     242        public function set visible(value:Boolean):void 
     243        { 
     244            _visible = value; 
     245        } 
     246 
     247        /** 
     248        * オブジェクトの両面を描画するか否かです。 
     249        */ 
     250        public function get doubleSide():Boolean 
     251        { 
     252            return _doubleSide; 
     253        } 
     254 
     255        public function set doubleSide(value:Boolean):void 
     256        { 
     257            _doubleSide = value; 
     258 
     259            for each (var surface:Surface3D in _surfaces) 
     260            { 
     261                surface.doubleSide = _doubleSide; 
     262            } 
     263        } 
     264 
     265        /** 
     266        * このオブジェクトの位置をベクトルで表したものです。 
     267        */ 
     268        public function get position():Vector3D 
     269        { 
     270            return _position; 
     271        } 
     272 
     273        /** 
     274        * このオブジェクトの色です。 
     275        */ 
     276        public function get color():ColorRGB 
     277        { 
     278            return _color; 
     279        } 
     280 
     281        public function set color(value:ColorRGB):void 
     282        { 
     283            _color = value; 
     284        } 
     285 
     286        /** 
     287        * 平行光源に対する反射率です。 
     288        */ 
     289        public function get diffuse():VectorRGB 
     290        { 
     291            return _diffuse; 
     292        } 
     293 
     294        public function set diffuse(value:VectorRGB):void 
     295        { 
     296            _diffuse = value; 
     297        } 
     298 
     299        /** 
     300        * このオブジェクトのテクスチャです。 
     301        */ 
     302        public function get texture():BitmapData 
     303        { 
     304            return _texture; 
     305        } 
     306 
     307        public function set texture(value:BitmapData):void 
     308        { 
     309            _texture = value; 
     310        } 
     311 
     312        /** 
     313        * このオブジェクトに適用するシェーディングの種類です。 
     314        */ 
     315        public function get shadingType():String 
     316        { 
     317            return _shadingType; 
     318        } 
     319 
     320        public function set shadingType(value:String):void 
     321        { 
     322            _shadingType = value; 
     323        } 
     324 
     325        /** 
     326        * 頂点が格納された配列です。 
     327        */ 
     328        public function get vertices():Array 
     329        { 
     330            return _vertices.concat(); 
     331        } 
     332 
     333        /** 
     334        * 平面が格納された配列です。 
     335        */ 
     336        public function get surfaces():Array 
     337        { 
     338            return _surfaces.concat(); 
     339        } 
     340 
     341        /** 
     342        * 指定されたインデックス値の頂点を返します。 
     343        * 
     344        * @param 頂点のインデックス値です。 
     345        */ 
     346        public function getVertexAt(index:int):Vertex3D 
     347        { 
     348            return _vertices[index]; 
     349        } 
     350 
     351        /** 
     352        * 指定されたインデックス値の平面を返します。 
     353        * 
     354        * @param 平面のインデックス値です。 
     355        */ 
     356        public function getSurfaceAt(index:int):Surface3D 
     357        { 
     358            return _surfaces[index]; 
     359        } 
     360 
     361        /** 
     362        * このオブジェクトに含まれる平面全てを反転します。 
     363        */ 
     364        public function flip():void 
     365        { 
     366            for each (var surface:Surface3D in _surfaces) 
     367            { 
     368                surface.flip(); 
     369            } 
     370        } 
     371 
     372        /** 
     373        * @private 
     374        */ 
     375        as3d_internal function get transformMatrix():Matrix3D 
     376        { 
     377            _transformMatrix.identity(); 
     378 
     379            _transformMatrix.scale(scaleX, scaleY, scaleZ); 
     380            _transformMatrix.rotate( 
     381                rotationX * TO_RADIAN, 
     382                rotationY * TO_RADIAN, 
     383                rotationZ * TO_RADIAN); 
     384            _transformMatrix.translate(x, y, z); 
     385 
     386            return _transformMatrix; 
     387        } 
     388 
     389        /** 
     390        * @private 
     391        */ 
     392        protected function addSurface(v1:Vertex3D, v2:Vertex3D, v3:Vertex3D):void 
     393        { 
     394            _va.x = v1.x - v2.x; _va.y = v1.y - v2.y; _va.z = v1.z - v2.z; 
     395            _vb.x = v1.x - v3.x; _vb.y = v1.y - v3.y; _vb.z = v1.z - v3.z; 
     396 
     397            _va.cross(_vb); 
     398            _va.normalize(); 
     399 
     400            v1.normal.add(_va); 
     401            v2.normal.add(_va); 
     402            v3.normal.add(_va); 
     403            v1.numUsed++; 
     404            v2.numUsed++; 
     405            v3.numUsed++; 
     406 
     407            _surfaces.push(new Surface3D(v1, v2, v3, _va.clone(), this)); 
     408        } 
     409 
     410        /** 
     411        * @private 
     412        */ 
     413        protected function endBuild():void 
     414        { 
     415            for each (var vertex:Vertex3D in _vertices) 
     416            { 
     417                if (vertex.numUsed > 0) 
     418                { 
     419                    vertex.normal.x /= vertex.numUsed; 
     420                    vertex.normal.y /= vertex.numUsed; 
     421                    vertex.normal.z /= vertex.numUsed; 
     422 
     423                    vertex.numUsed = 0; 
     424                } 
     425 
     426                vertex.normal.normalize(); 
     427            } 
     428        } 
     429    } 
    429430}