Section 1
//MainTimeline (modelViewer_fla.MainTimeline)
package modelViewer_fla {
import pixels3d.*;
import flash.geom.*;
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.net.*;
import flash.ui.*;
import adobe.utils.*;
import flash.accessibility.*;
import flash.errors.*;
import flash.external.*;
import flash.filters.*;
import flash.media.*;
import flash.printing.*;
import flash.system.*;
import flash.xml.*;
public dynamic class MainTimeline extends MovieClip {
public var stage3d:Stage3D;
public var bgColor:uint;
public var OLD_X:Number;
public var OLD_Y:Number;
public var OLD_Z:Number;
public var copyText:String;
public var tF:TextFormat;
public var initHeight:int;
public var perspectiveDistance:Number;
public var center:Array;
public var txt:TextField;
public var MODEL_TEXT:Array;
public var resolution:Number;
public var EDIT_MODE:int;
public var VAR_NAME:String;
public var OLD_DIST:Number;
public var OLD_MX:Number;
public var OLD_MY:Number;
public var orthographicScale:Number;
public var curResolution:int;
public var defMat:Material3D;
public var camera:Camera3D;
public var model:Model3D;
public var light:Light3D;
public var position:Array;
public var resolutions:Array;
public var hAngle:Number;
public var modelName:String;
public var scale:Number;
public var bmp:Bitmap;
public var initCenter:Array;
public var dist:Number;
public var light2:Light3D;
public var light3:Light3D;
public var perspectiveAngle:Number;
public var vAngle:Number;
public function MainTimeline(){
addFrameScript(0, frame1);
}
function frame1(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
txt = new TextField();
tF = new TextFormat();
MODEL_TEXT = [];
MODEL_TEXT[MODEL_TEXT.length] = <![CDATA[
s 1
g Eye1
usemtl Eye
v -0.27478 5.09026 0.25027
v -0.39502 5.09998 0.0388
v -0.21614 5.43267 0.29751
v -0.4059 5.46848 -0.03123
v -0.17919 5.32731 0.10726
v -0.32577 5.4508 0.17515
v -0.20436 5.24156 0.31399
v -0.44214 5.27901 -0.06779
v -0.32845 5.53506 0.14162
v -0.29609 5.21151 0.24259
v -0.36778 5.22182 0.08025
v -0.27834 5.38142 0.24063
v -0.37659 5.38053 0.08702
v -0.32734 5.1668 0.16041
f 3 7 5
f 3 9 6
f 5 7 1
f 2 11 8
f 6 9 4
f 3 5 9
f 4 9 5
f 4 5 8
f 5 1 2
f 8 5 2
f 7 10 1
f 11 13 8
f 7 12 10
f 2 14 11
f 13 6 4
f 4 8 13
f 3 6 12
f 12 7 3
f 1 10 14
f 1 14 2
s 1
g Amber
usemtl Fur
v -0.38235 2.41157 0.37177
v -0.47161 2.41157 -0.46306
v -0.33138 3.28393 0.42316
v -0.33138 3.28393 -0.33127
v 0 3.0156 0.65197
v 0 2.94522 -0.57384
v 0 3.28393 0.53451
v 0 3.28393 -0.45054
v -0.41513 2.94522 0.43947
v -0.4515 2.94522 -0.45249
v -0.48013 3.28393 -0.0437
v -0.23165 3.64582 0.30265
v -0.23165 3.64582 -0.14076
v 0 3.64582 0.38772
v 0 3.64582 -0.22582
v -0.35751 3.64582 0.08095
v -0.24977 3.89009 0.24204
v -0.25065 3.8906 -0.19975
v -0.00003 3.89063 0.33414
v 0 3.8906 -0.28941
v -0.37724 3.8906 0.02233
v -0.33725 3.98922 0.22085
v -0.29646 3.9888 -0.27888
v 0 3.9888 -0.3552
v -0.43906 3.9888 0.00162
v -0.27774 4.39431 0.20098
v -0.45141 4.27131 -0.25238
v 0 4.28587 0.31133
v 0 4.24436 -0.36502
v -0.26479 4.54047 0.05392
v -0.56446 4.51794 -0.25238
v 0 4.54047 0.1865
v 0 4.54047 -0.33458
v -0.56446 4.51794 -0.02769
v 0 2.41157 0.50992
v -0.28712 1.94539 -0.25946
v -0.3128 1.94539 0.10588
v 0 1.94539 0.18736
v 0 1.94539 -0.35625
v -0.12529 4.60075 0.00964
v -0.12529 4.60075 -0.23149
v 0 4.60075 0.04245
v 0 4.60075 -0.2643
v -0.18968 4.60075 -0.11092
v -0.12455 4.74691 -0.00855
v -0.12455 4.74691 -0.22618
v 0 4.74691 0.02105
v 0 4.74691 -0.25579
v -0.18855 4.74691 -0.11737
v -0.26285 4.78698 0.13877
v -0.3847 4.83576 -0.39643
v 0 4.74858 0.21493
v 0 4.83576 -0.46252
v -0.46798 4.82909 -0.14193
v -0.20351 5.24122 0.31391
v -0.37927 5.05511 -0.5352
v 0 5.23998 0.42388
v 0 5.10246 -0.627
v -0.44182 5.27861 -0.06796
v -0.20216 5.50812 0.3577
v -0.35601 5.45635 -0.45955
v 0 5.50606 0.42902
v 0 5.48157 -0.56319
v -0.39401 5.52268 -0.13253
v -0.18616 5.67894 0.14757
v -0.29169 5.59162 -0.41354
v 0 5.6492 0.26057
v 0 5.6583 -0.41175
v -0.33059 5.63646 -0.15279
v -0.45141 4.27131 -0.02769
v 0 5.727 0.03809
v 0 5.74029 -0.23722
v -0.19889 5.72402 -0.11666
v -0.08401 4.73749 0.44337
v 0 4.73384 0.4712
v -0.17273 5.08082 0.6797
v -0.48342 5.67935 -0.54972
v -0.50802 5.79639 -0.28282
v -0.39673 5.78879 -0.54601
v -0.4211 5.87492 -0.3548
v -0.64946 5.85726 -0.69513
v -0.63511 6.03544 -0.31556
v -0.48793 6.024 -0.65463
v -0.52462 6.09307 -0.41714
v -0.69404 6.09511 -0.69845
v -0.67133 6.18826 -0.4345
v -0.62276 6.16129 -0.68664
v -0.61376 6.20471 -0.49892
v -0.6757 6.226 -0.6107
v -0.59544 6.21015 -0.58878
v -0.69404 6.14748 -0.5779
v -0.39384 5.87037 -0.45865
v -0.47476 6.09681 -0.54262
v -0.45345 5.37317 -0.31226
v -0.29322 5.65036 -0.28928
v -2.08839 4.29531 -0.27658
v -2.08839 4.47158 -0.27658
v -2.08839 4.47158 -0.03944
v -2.08839 4.29531 -0.03944
v -0.44923 2.0233 -1.18411
v 0 2.41182 -1.31633
v 0 1.64167 -1.05422
v -0.33594 1.68421 -2.07574
v 0 1.96549 -2.13253
v 0 1.40791 -1.9829
v -0.1186 1.42886 -3.02392
v 0 1.55129 -3.02394
v 0 1.30859 -3.0239
v 0 1.87037 -0.07649
v 0 1.42994 -3.19498
v -0.5731 4.58343 -0.13804
v -0.45816 4.30272 -0.13804
v -0.62958 2.31056 -0.31597
v -0.62366 2.79215 -0.29863
v -0.60878 3.06286 -0.04418
v -0.65984 2.79215 0.30349
v -0.68916 2.38964 0.43279
v -0.29159 1.44771 -0.24694
v -0.4071 1.79782 0.46921
v -0.68883 1.78437 0.40588
v -0.59797 1.44771 -0.24898
v -1.30673 4.35443 -0.02137
v -1.30673 4.52709 -0.17788
v -1.30673 4.27131 -0.05245
v -1.30673 4.46429 -0.25238
v -1.30673 4.24726 -0.15015
v -1.30673 4.25313 -0.2674
v -0.32638 1.19071 -0.2298
v -0.41713 1.43543 0.33551
v -0.65488 1.42468 0.28758
v -0.56528 1.17595 -0.25406
v -0.23947 1.3469 -0.46588
v -0.50125 1.35848 -0.48392
v -0.24155 1.14855 -0.48185
v -0.52368 1.14455 -0.48517
v -0.3637 0.32914 -0.09312
v -0.71218 0.32914 -0.13618
v -0.29527 0.32914 -0.35098
v -0.64372 0.32914 -0.39004
v -2.26883 4.33308 -0.36204
v -2.24477 4.47407 -0.36204
v -2.24477 4.47407 0.04601
v -2.26883 4.33308 0.04601
v -2.3285 4.48921 -0.23629
v -2.3285 4.31978 -0.23629
v -2.3285 4.48921 -0.07974
v -2.3285 4.31978 -0.07974
v -2.08839 4.49616 -0.15801
v -2.08839 4.28172 -0.15801
v -2.38993 4.30246 -0.45836
v -2.38993 4.47407 -0.45836
v -2.38992 4.47407 0.14234
v -2.38992 4.30246 0.14234
v -2.49923 4.48921 -0.2823
v -2.49923 4.30246 -0.2823
v -2.50012 4.48921 -0.04508
v -2.50012 4.30246 -0.04508
v -2.504 4.48921 -0.2702
v -2.504 4.30246 -0.2702
v -2.504 4.48921 -0.05315
v -2.504 4.30246 -0.05315
v -0.32309 0 -0.21333
v -0.67189 0 -0.24288
v -0.26078 0 -0.0585
v -0.83918 0 -0.15994
v -0.70075 0 0.0026
v -0.68255 0.37716 -0.03416
v -0.45941 0.37716 0.0036
v -0.46295 0 0.03593
v -0.53794 0.40256 -0.08644
v 0 4.84719 0.61669
v 0 4.78715 0.53452
v -0.15372 4.83095 0.4194
v -0.22777 0.3133 0.16514
v -0.94404 0.31452 0.06048
v -0.20152 0 0.20453
v -0.99565 0 0.08573
v -0.78188 0 0.27188
v -0.7822 0.31452 0.22694
v -0.44374 0.31645 0.27584
v -0.45272 0 0.30936
v -0.76257 0 0.28808
v -0.73615 0.31735 0.25654
v -0.47863 0.31419 0.27672
v -0.47026 0 0.31689
v -0.55857 2.41934 0.56043
v -0.4534 1.14051 -0.17252
v -0.56698 1.74351 0.60129
v -0.53251 1.39839 0.35188
v -0.53748 2.88725 0.39469
v -0.48358 0.16435 -0.34093
v -0.53758 2.89169 -0.4066
v -0.5506 2.33264 -0.42482
v -0.44478 1.49069 -0.27304
v -0.41835 2.41546 0.48777
v -0.07826 4.78715 0.53452
v -0.3632 1.40438 -0.54481
v -0.38262 1.14055 -0.51951
v -0.4695 0.32914 -0.40451
v -0.65964 5.98363 -0.63297
v -0.65096 6.08537 -0.43544
v -0.49622 5.73218 -0.50001
v -0.39122 5.4766 -0.40256
v -0.39794 5.52048 -0.22967
v -0.51234 5.78648 -0.34391
v -0.11703 4.80972 0.47872
v -0.11153 4.84 0.57135
v -0.20139 4.90745 0.43105
v 0 4.79292 0.50742
v -0.0708 4.79418 0.50739
v -0.10013 4.81225 0.46396
v -0.1387 4.84267 0.41298
v -0.10701 4.84013 0.54357
v 0 4.84749 0.58146
v -0.12973 4.84083 0.47942
v -0.14576 4.83322 0.49652
v 0 5.0089 0.68284
v 0 5.11867 0.66328
v -0.05992 5.08404 0.69519
v -0.05954 4.84041 0.60774
v -0.05615 4.84063 0.57623
v -0.44868 5.87283 -0.44829
v -0.54495 4.28558 0.41554
v -0.15046 4.39241 0.22978
v 0 4.47622 0.5738
v -2.21763 4.27723 -0.15801
v -2.41625 4.30085 -0.15801
v -2.3285 4.308 -0.15801
v -0.02098 3.87721 0.46454
v -0.41982 4.28698 0.14871
v 0 3.98942 0.3477
v -0.55469 4.04999 0.18448
v -0.013 4.0657 0.42605
v -0.59886 4.05772 0.52092
v -0.52502 3.87721 0.34654
v -0.0544 4.05772 0.64834
v -0.04459 4.28558 0.53274
v -0.2533 4.40069 0.35354
v -0.34101 4.24067 0.6486
v -0.34305 3.79547 0.64533
v -0.22932 3.95353 0.26432
v -0.36455 4.03573 0.73745
v -0.29756 4.3503 0.49796
v -0.27355 3.72196 0.39555
v 0 4.26228 0.69119
v 0 3.8775 0.65951
v -0.15022 4.35577 0.49182
v -0.11249 4.29413 0.55438
v -0.07948 4.54728 0.34501
v -0.09979 4.47713 0.45381
v 0 4.57788 0.38535
v 0 4.28871 0.60252
v 0 4.44082 0.47625
v -0.17914 4.49873 0.36154
v -0.24483 4.35268 0.5908
v 0 4.1438 0.69783
v 0 4.09941 0.5189
v 0 4.40988 0.59139
v -0.06367 4.09345 0.65652
v -0.13661 4.48993 0.16308
v -0.6669 4.54271 -0.14441
v -1.68052 4.49836 -0.16611
v -1.68052 4.41054 -0.04365
v -0.97386 4.42894 -0.03873
v -0.97369 4.28643 -0.0524
v -1.68052 4.45945 -0.25207
v -1.68052 4.31147 -0.05748
v -0.9737 4.27011 -0.14387
v -1.68052 4.28266 -0.15377
v -0.97401 4.50866 -0.15886
v -1.68052 4.31146 -0.25875
v -0.97369 4.28642 -0.24569
v -0.97386 4.4733 -0.23909
v -0.28339 5.09751 0.25048
v -0.40286 5.10721 0.04076
v -0.21535 5.43305 0.29573
v -0.40431 5.46564 -0.02984
v -0.33058 5.52987 0.14142
v -0.22993 5.14482 -0.01168
v -0.19566 5.4824 0.0681
v -0.15076 5.13813 0.21539
v -0.47515 5.36016 -0.14324
v -0.56977 5.09133 -0.22133
v -0.43135 4.92893 0.14347
v -0.54705 0 -0.09926
v -0.51735 0 -0.22964
v -0.22771 4.54984 0.2731
v -0.26053 4.47192 0.26499
v -0.25993 4.41264 0.42771
v -0.15556 4.46521 0.47893
v -0.3083 2.94522 0.47669
v 0 2.81115 0.565
v 0 3.06233 0.56558
v -0.22497 3.06361 0.49232
v -0.25721 2.84145 0.48347
v -0.22951 3.01221 0.59854
v -0.23604 2.90075 0.55645
v 0 2.87892 0.6192
v -0.33444 5.11959 0.17994
v -0.07652 4.91411 0.65549
v -0.16076 4.91373 0.63994
v 0 4.91321 0.66325
v -0.14195 5.16263 0.50455
v 0 5.14912 0.60274
v -0.22207 5.08916 0.46595
v 0 5.33343 0.39892
v -0.35034 5.5939 0.12781
v -0.42884 5.50083 -0.05452
v 0.38235 2.41157 0.37177
v 0.47161 2.41157 -0.46306
v 0.33138 3.28393 0.42316
v 0.33138 3.28393 -0.33127
v 0.41513 2.94522 0.43947
v 0.4515 2.94522 -0.45249
v 0.48013 3.28393 -0.0437
v 0.23165 3.64582 0.30265
v 0.23165 3.64582 -0.14076
v 0.35751 3.64582 0.08095
v 0.24977 3.89009 0.24204
v 0.25065 3.8906 -0.19975
v 0.37724 3.8906 0.02233
v 0.33725 3.98922 0.22085
v 0.29646 3.9888 -0.27888
v 0.43906 3.9888 0.00162
v 0.27774 4.39431 0.20098
v 0.45141 4.27131 -0.25238
v 0.26479 4.54047 0.05392
v 0.56446 4.51794 -0.25238
v 0.56446 4.51794 -0.02769
v 0.28712 1.94539 -0.25946
v 0.3128 1.94539 0.10588
v 0.12529 4.60075 0.00964
v 0.12529 4.60075 -0.23149
v 0.18968 4.60075 -0.11092
v 0.12455 4.74691 -0.00855
v 0.12455 4.74691 -0.22618
v 0.18855 4.74691 -0.11737
v 0.26285 4.78698 0.13877
v 0.3847 4.83576 -0.39643
v 0.46798 4.82909 -0.14193
v 0.20351 5.24122 0.31391
v 0.37927 5.05511 -0.5352
v 0.44182 5.27861 -0.06796
v 0.20216 5.50812 0.3577
v 0.35601 5.45635 -0.45955
v 0.39401 5.52268 -0.13253
v 0.18616 5.67894 0.14757
v 0.29169 5.59162 -0.41354
v 0.33059 5.63646 -0.15279
v 0.45141 4.27131 -0.02769
v 0.19889 5.72402 -0.11666
v 0.08401 4.73749 0.44337
v 0.17273 5.08082 0.6797
v 0.48342 5.67935 -0.54972
v 0.50802 5.79639 -0.28282
v 0.39673 5.78879 -0.54601
v 0.4211 5.87492 -0.3548
v 0.64946 5.85726 -0.69513
v 0.63511 6.03544 -0.31556
v 0.48793 6.024 -0.65463
v 0.52462 6.09307 -0.41714
v 0.69404 6.09511 -0.69845
v 0.67133 6.18826 -0.4345
v 0.62276 6.16129 -0.68664
v 0.61376 6.20471 -0.49892
v 0.6757 6.226 -0.6107
v 0.59544 6.21015 -0.58878
v 0.69404 6.14748 -0.5779
v 0.39384 5.87037 -0.45865
v 0.47476 6.09681 -0.54262
v 0.45345 5.37317 -0.31226
v 0.29322 5.65036 -0.28928
v 2.08839 4.29531 -0.27658
v 2.08839 4.47158 -0.27658
v 2.08839 4.47158 -0.03944
v 2.08839 4.29531 -0.03944
v 0.44923 2.0233 -1.18411
v 0.33594 1.68421 -2.07574
v 0.1186 1.42886 -3.02392
v 0.5731 4.58343 -0.13804
v 0.45816 4.30272 -0.13804
v 0.62958 2.31056 -0.31597
v 0.62366 2.79215 -0.29863
v 0.60878 3.06286 -0.04418
v 0.65984 2.79215 0.30349
v 0.68916 2.38964 0.43279
v 0.29159 1.44771 -0.24694
v 0.4071 1.79782 0.46921
v 0.68883 1.78437 0.40588
v 0.59797 1.44771 -0.24898
v 1.30673 4.35443 -0.02137
v 1.30673 4.52709 -0.17788
v 1.30673 4.27131 -0.05245
v 1.30673 4.46429 -0.25238
v 1.30673 4.24726 -0.15015
v 1.30673 4.25313 -0.2674
v 0.32638 1.19071 -0.2298
v 0.41713 1.43543 0.33551
v 0.65488 1.42468 0.28758
v 0.56528 1.17595 -0.25406
v 0.23947 1.3469 -0.46588
v 0.50125 1.35848 -0.48392
v 0.24155 1.14855 -0.48185
v 0.52368 1.14455 -0.48517
v 0.3637 0.32914 -0.09312
v 0.71218 0.32914 -0.13618
v 0.29527 0.32914 -0.35098
v 0.64372 0.32914 -0.39004
v 2.26883 4.33308 -0.36204
v 2.24477 4.47407 -0.36204
v 2.24477 4.47407 0.04601
v 2.26883 4.33308 0.04601
v 2.3285 4.48921 -0.23629
v 2.3285 4.31978 -0.23629
v 2.3285 4.48921 -0.07974
v 2.3285 4.31978 -0.07974
v 2.08839 4.49616 -0.15801
v 2.08839 4.28172 -0.15801
v 2.38993 4.30246 -0.45836
v 2.38993 4.47407 -0.45836
v 2.38992 4.47407 0.14234
v 2.38992 4.30246 0.14234
v 2.49923 4.48921 -0.2823
v 2.49923 4.30246 -0.2823
v 2.50012 4.48921 -0.04508
v 2.50012 4.30246 -0.04508
v 2.504 4.48921 -0.2702
v 2.504 4.30246 -0.2702
v 2.504 4.48921 -0.05315
v 2.504 4.30246 -0.05315
v 0.32309 0 -0.21333
v 0.67189 0 -0.24288
v 0.26078 0 -0.0585
v 0.83918 0 -0.15994
v 0.70075 0 0.0026
v 0.68255 0.37716 -0.03416
v 0.45941 0.37716 0.0036
v 0.46295 0 0.03593
v 0.53794 0.40256 -0.08644
v 0.15372 4.83095 0.4194
v 0.22777 0.3133 0.16514
v 0.94404 0.31452 0.06048
v 0.20152 0 0.20453
v 0.99565 0 0.08573
v 0.78188 0 0.27188
v 0.7822 0.31452 0.22694
v 0.44374 0.31645 0.27584
v 0.45272 0 0.30936
v 0.76257 0 0.28808
v 0.73615 0.31735 0.25654
v 0.47863 0.31419 0.27672
v 0.47026 0 0.31689
v 0.55857 2.41934 0.56043
v 0.4534 1.14051 -0.17252
v 0.56698 1.74351 0.60129
v 0.53251 1.39839 0.35188
v 0.53748 2.88725 0.39469
v 0.48358 0.16435 -0.34093
v 0.53758 2.89169 -0.4066
v 0.5506 2.33264 -0.42482
v 0.44478 1.49069 -0.27304
v 0.41835 2.41546 0.48777
v 0.07826 4.78715 0.53452
v 0.3632 1.40438 -0.54481
v 0.38262 1.14055 -0.51951
v 0.4695 0.32914 -0.40451
v 0.65964 5.98363 -0.63297
v 0.65096 6.08537 -0.43544
v 0.49622 5.73218 -0.50001
v 0.39122 5.4766 -0.40256
v 0.39794 5.52048 -0.22967
v 0.51234 5.78648 -0.34391
v 0.11703 4.80972 0.47872
v 0.11153 4.84 0.57135
v 0.20139 4.90745 0.43105
v 0.0708 4.79418 0.50739
v 0.10013 4.81225 0.46396
v 0.1387 4.84267 0.41298
v 0.10701 4.84013 0.54357
v 0.12973 4.84083 0.47942
v 0.14576 4.83322 0.49652
v 0.05992 5.08404 0.69519
v 0.05954 4.84041 0.60774
v 0.05615 4.84063 0.57623
v 0.44868 5.87283 -0.44829
v 0.54495 4.28558 0.41554
v 0.15046 4.39241 0.22978
v 2.21763 4.27723 -0.15801
v 2.41625 4.30085 -0.15801
v 2.3285 4.308 -0.15801
v 0.02098 3.87721 0.46454
v 0.41982 4.28698 0.14871
v 0.55469 4.04999 0.18448
v 0.013 4.0657 0.42605
v 0.59886 4.05772 0.52092
v 0.52502 3.87721 0.34654
v 0.0544 4.05772 0.64834
v 0.04459 4.28558 0.53274
v 0.2533 4.40069 0.35354
v 0.34101 4.24067 0.6486
v 0.34305 3.79547 0.64533
v 0.22932 3.95353 0.26432
v 0.36455 4.03573 0.73745
v 0.29756 4.3503 0.49796
v 0.27355 3.72196 0.39555
v 0.15022 4.35577 0.49182
v 0.11249 4.29413 0.55438
v 0.07948 4.54728 0.34501
v 0.09979 4.47713 0.45381
v 0.17914 4.49873 0.36154
v 0.24483 4.35268 0.5908
v 0.06367 4.09345 0.65652
v 0.13661 4.48993 0.16308
v 0.6669 4.54271 -0.14441
v 1.68052 4.49836 -0.16611
v 1.68052 4.41054 -0.04365
v 0.97386 4.42894 -0.03873
v 0.97369 4.28643 -0.0524
v 1.68052 4.45945 -0.25207
v 1.68052 4.31147 -0.05748
v 0.9737 4.27011 -0.14387
v 1.68052 4.28266 -0.15377
v 0.97401 4.50866 -0.15886
v 1.68052 4.31146 -0.25875
v 0.97369 4.28642 -0.24569
v 0.97386 4.4733 -0.23909
v 0.28339 5.09751 0.25048
v 0.40286 5.10721 0.04076
v 0.21535 5.43305 0.29573
v 0.40431 5.46564 -0.02984
v 0.33058 5.52987 0.14142
v 0.22993 5.14482 -0.01168
v 0.19566 5.4824 0.0681
v 0.15076 5.13813 0.21539
v 0.47515 5.36016 -0.14324
v 0.56977 5.09133 -0.22133
v 0.43135 4.92893 0.14347
v 0.54705 0 -0.09926
v 0.51735 0 -0.22964
v 0.22771 4.54984 0.2731
v 0.26053 4.47192 0.26499
v 0.25993 4.41264 0.42771
v 0.15556 4.46521 0.47893
v 0.3083 2.94522 0.47669
v 0.22497 3.06361 0.49232
v 0.25721 2.84145 0.48347
v 0.22951 3.01221 0.59854
v 0.23604 2.90075 0.55645
v 0.33444 5.11959 0.17994
v 0.07652 4.91411 0.65549
v 0.16076 4.91373 0.63994
v 0.14195 5.16263 0.50455
v 0.22207 5.08916 0.46595
v 0.35034 5.5939 0.12781
v 0.42884 5.50083 -0.05452
f 238 252 251
f 17 21 26
f 26 21 28
f 25 17 30
f 30 17 26
f 26 28 31
f 35 31 39
f 39 31 36
f 51 52 15
f 15 52 49
f 16 53 50
f 58 44 54
f 44 46 54
f 54 46 56
f 38 37 41
f 38 41 43
f 29 27 32
f 29 32 34
f 32 35 39
f 32 39 37
f 34 32 37
f 34 37 38
f 47 45 55
f 47 55 57
f 58 54 63
f 63 54 59
f 54 56 59
f 55 58 63
f 55 63 60
f 57 55 60
f 57 60 62
f 62 60 65
f 62 65 67
f 61 59 56
f 74 76 79
f 79 76 81
f 25 23 17
f 27 29 22
f 27 22 18
f 25 30 27
f 25 27 18
f 26 31 35
f 26 35 30
f 30 35 32
f 30 32 27
f 64 59 61
f 66 64 61
f 67 65 70
f 67 70 72
f 70 108 75
f 72 70 75
f 72 75 77
f 102 103 100
f 99 103 101
f 77 75 80
f 77 80 82
f 40 238 44
f 268 301 303
f 305 308 23
f 24 18 22
f 20 24 22
f 18 24 25
f 95 93 91
f 83 79 87
f 64 66 88
f 88 66 89
f 85 86 87
f 78 83 92
f 92 83 94
f 92 94 96
f 96 94 98
f 96 98 100
f 100 98 102
f 99 105 103
f 102 104 103
f 103 105 100
f 103 104 101
f 70 297 108
f 78 218 108
f 87 109 83
f 109 80 93
f 94 83 109
f 106 94 109
f 109 93 106
f 98 94 106
f 106 93 97
f 106 97 107
f 215 236 219
f 95 214 99
f 105 215 100
f 101 97 99
f 91 80 75
f 91 216 95
f 97 93 95
f 50 132 16
f 97 95 99
f 91 93 80
f 16 24 20
f 16 20 114
f 114 20 115
f 121 124 120
f 53 16 114
f 53 114 116
f 116 114 119
f 119 114 117
f 118 117 114
f 118 114 115
f 117 118 120
f 120 118 121
f 50 53 123
f 52 51 123
f 117 120 119
f 120 122 119
f 120 124 122
f 131 127 135
f 132 51 133
f 129 128 130
f 131 128 127
f 84 39 36
f 36 244 84
f 50 51 132
f 84 279 126
f 130 128 131
f 131 135 134
f 59 64 63
f 64 68 63
f 65 60 63
f 65 63 68
f 50 123 51
f 24 206 25
f 162 276 111
f 125 275 48
f 136 278 137
f 138 279 136
f 210 186 224
f 226 187 225
f 132 133 142
f 142 133 143
f 134 135 144
f 144 135 145
f 148 142 152
f 152 142 150
f 145 149 151
f 151 149 153
f 111 110 155
f 155 110 154
f 155 158 111
f 113 112 157
f 157 112 156
f 173 175 172
f 172 175 174
f 160 156 112
f 162 111 158
f 160 112 162
f 160 162 158
f 224 186 223
f 154 159 164
f 164 159 169
f 156 160 166
f 166 160 170
f 157 156 167
f 167 156 166
f 159 158 169
f 169 158 168
f 160 161 170
f 170 161 171
f 158 159 172
f 172 159 173
f 160 158 174
f 174 158 172
f 159 242 241
f 173 241 175
f 161 160 175
f 175 160 174
f 188 194 190
f 152 150 176
f 153 213 205
f 176 300 205
f 196 199 197
f 197 199 198
f 190 194 195
f 184 181 182
f 184 182 150
f 188 182 194
f 189 179 191
f 179 180 191
f 191 180 192
f 180 181 192
f 192 181 193
f 182 183 194
f 194 183 195
f 180 183 196
f 196 183 199
f 181 180 197
f 197 180 196
f 182 181 198
f 198 181 197
f 183 182 199
f 199 182 198
f 150 142 201
f 201 145 151
f 201 151 184
f 184 150 201
f 25 204 23
f 202 134 144
f 143 133 202
f 203 143 202
f 202 144 203
f 203 144 145
f 142 143 203
f 201 142 203
f 201 203 145
f 153 205 177
f 176 205 152
f 207 16 132
f 135 127 207
f 207 132 208
f 135 207 208
f 206 24 16
f 127 128 206
f 207 127 206
f 206 16 207
f 23 209 15
f 133 51 209
f 51 15 209
f 181 184 151
f 189 193 181
f 177 179 151
f 153 177 151
f 150 178 176
f 181 151 189
f 151 179 189
f 182 188 150
f 150 188 178
f 188 190 178
f 179 177 180
f 178 183 176
f 177 300 299
f 180 299 183
f 178 190 183
f 190 195 183
f 88 89 210
f 210 89 186
f 131 134 202
f 202 200 131
f 209 200 202
f 202 133 209
f 131 200 204
f 131 204 130
f 204 200 23
f 200 209 23
f 205 213 152
f 212 148 152
f 149 212 153
f 212 152 213
f 153 212 213
f 147 149 145
f 145 135 147
f 146 132 142
f 146 142 148
f 212 211 148
f 211 146 148
f 149 147 211
f 211 212 149
f 211 147 135
f 208 211 135
f 132 146 211
f 132 211 208
f 206 128 129
f 206 129 25
f 129 130 204
f 129 204 25
f 99 214 105
f 106 107 98
f 100 215 96
f 108 217 75
f 91 75 217
f 216 91 217
f 214 95 216
f 78 92 219
f 218 78 219
f 217 108 218
f 219 92 96
f 219 96 215
f 107 97 101
f 104 107 101
f 98 107 102
f 102 107 104
f 210 220 88
f 210 224 220
f 187 222 64
f 187 230 222
f 187 64 88
f 187 88 220
f 220 225 187
f 224 225 220
f 140 282 138
f 227 221 230
f 229 227 230
f 229 230 187
f 226 229 187
f 126 41 37
f 39 84 126
f 39 126 37
f 171 161 167
f 167 161 157
f 155 165 158
f 158 165 168
f 154 164 155
f 155 164 165
f 230 315 222
f 185 314 234
f 221 227 234
f 227 235 234
f 235 228 234
f 234 228 185
f 214 216 236
f 105 214 236
f 215 105 236
f 216 217 236
f 219 236 218
f 236 217 218
f 193 189 191
f 191 192 193
f 40 244 237
f 238 274 44
f 154 240 159
f 159 241 173
f 175 241 161
f 241 242 161
f 159 240 242
f 161 242 240
f 161 240 157
f 110 163 240
f 240 154 110
f 240 163 113
f 240 113 157
f 168 165 164
f 169 168 164
f 167 166 170
f 167 170 171
f 237 252 40
f 84 244 40
f 301 302 303
f 248 256 253
f 42 247 245
f 36 246 244
f 247 250 243
f 36 249 246
f 250 256 254
f 238 251 42
f 251 257 253
f 247 243 245
f 249 258 254
f 249 248 246
f 31 28 33
f 237 257 252
f 40 252 238
f 248 253 237
f 250 254 243
f 251 253 250
f 249 254 248
f 253 256 250
f 254 256 248
f 253 257 237
f 254 258 243
f 252 257 251
f 36 31 255
f 31 33 255
f 255 33 245
f 246 248 237
f 246 237 244
f 250 247 251
f 251 247 42
f 249 36 258
f 258 36 255
f 243 258 245
f 258 255 245
f 238 262 261
f 261 262 259
f 239 265 263
f 264 304 261
f 263 264 239
f 262 273 270
f 259 262 266
f 238 42 262
f 239 264 267
f 269 268 238
f 269 304 268
f 238 261 269
f 262 270 266
f 260 273 271
f 264 272 267
f 264 261 272
f 261 259 272
f 270 273 260
f 271 273 262
f 44 274 46
f 69 317 71
f 232 318 233
f 90 314 233
f 275 284 48
f 45 275 125
f 45 125 55
f 55 125 58
f 125 48 44
f 125 44 58
f 140 283 141
f 110 285 163
f 48 278 84
f 44 48 84
f 44 84 40
f 139 287 141
f 41 286 45
f 41 45 43
f 45 47 43
f 283 163 285
f 141 283 285
f 281 113 163
f 163 283 281
f 283 140 138
f 281 283 138
f 112 113 281
f 112 281 277
f 136 277 281
f 281 138 136
f 280 111 276
f 139 141 285
f 280 139 285
f 285 110 111
f 285 111 280
f 286 141 287
f 45 286 287
f 278 48 284
f 284 137 278
f 287 139 137
f 287 137 284
f 141 286 282
f 141 282 140
f 282 126 279
f 282 279 138
f 287 284 45
f 45 284 275
f 280 276 139
f 137 139 276
f 162 112 276
f 277 276 112
f 137 276 277
f 136 137 277
f 126 282 286
f 126 286 41
f 278 136 279
f 84 278 279
f 222 288 64
f 71 290 69
f 74 292 290
f 289 293 73
f 73 293 291
f 293 294 291
f 291 294 292
f 289 313 293
f 294 293 295
f 295 69 290
f 294 295 290
f 292 294 290
f 71 320 290
f 295 288 69
f 291 296 73
f 108 297 296
f 296 297 73
f 291 322 296
f 78 108 296
f 70 65 297
f 289 73 297
f 297 65 68
f 68 298 297
f 64 298 68
f 297 298 289
f 177 299 180
f 183 299 176
f 205 300 177
f 299 300 176
f 238 268 303
f 263 301 268
f 302 238 303
f 238 302 274
f 274 302 301
f 274 301 46
f 301 263 46
f 263 265 46
f 261 304 269
f 268 304 263
f 263 304 264
f 262 42 271
f 23 309 305
f 308 305 310
f 307 308 310
f 307 310 19
f 309 311 305
f 305 311 310
f 306 311 309
f 312 311 306
f 19 310 311
f 19 311 312
f 298 313 289
f 23 15 309
f 15 49 309
f 306 309 49
f 17 23 308
f 21 17 308
f 21 308 307
f 221 234 314
f 230 221 315
f 314 90 315
f 315 221 314
f 231 233 314
f 185 316 314
f 314 316 231
f 293 313 295
f 288 295 313
f 222 319 288
f 90 317 319
f 319 317 69
f 319 69 288
f 315 90 319
f 315 319 222
f 74 290 320
f 76 74 320
f 78 321 83
f 321 292 74
f 79 83 321
f 79 321 74
f 85 87 79
f 85 79 81
f 109 87 86
f 80 109 86
f 82 80 86
f 292 322 291
f 296 322 78
f 321 78 322
f 292 321 322
f 298 64 288
f 313 298 288
f 90 233 318
f 317 90 318
f 71 317 318
f 501 512 513
f 325 330 21
f 330 28 21
f 329 332 325
f 332 330 325
f 330 333 28
f 335 338 333
f 338 336 333
f 345 323 52
f 323 49 52
f 324 344 53
f 348 346 341
f 341 346 46
f 346 56 46
f 38 340 337
f 38 43 340
f 29 334 331
f 29 34 334
f 334 338 335
f 334 337 338
f 34 337 334
f 34 38 337
f 47 347 342
f 47 57 347
f 348 351 346
f 351 349 346
f 346 349 56
f 347 351 348
f 347 350 351
f 57 350 347
f 57 62 350
f 62 353 350
f 62 67 353
f 61 56 349
f 358 361 76
f 361 81 76
f 329 325 327
f 331 22 29
f 331 326 22
f 329 331 332
f 329 326 331
f 330 335 333
f 330 332 335
f 332 334 335
f 332 331 334
f 352 61 349
f 66 61 352
f 67 356 353
f 67 72 356
f 356 359 385
f 72 359 356
f 72 77 359
f 379 377 380
f 376 378 380
f 77 362 359
f 77 82 362
f 339 341 501
f 524 556 554
f 558 327 559
f 328 22 326
f 20 22 328
f 326 329 328
f 372 368 370
f 363 365 361
f 352 366 66
f 366 89 66
f 85 365 86
f 360 369 363
f 369 371 363
f 369 373 371
f 373 375 371
f 373 377 375
f 377 379 375
f 376 380 382
f 379 380 381
f 380 377 382
f 380 378 381
f 356 385 550
f 360 385 485
f 365 363 386
f 386 370 362
f 371 386 363
f 383 386 371
f 386 383 370
f 375 383 371
f 383 374 370
f 383 384 374
f 482 486 499
f 372 376 481
f 382 377 482
f 378 376 374
f 368 359 362
f 368 372 483
f 374 372 370
f 344 324 401
f 374 376 372
f 368 362 370
f 324 20 328
f 324 391 20
f 391 115 20
f 121 393 124
f 53 391 324
f 53 116 391
f 116 119 391
f 119 392 391
f 118 391 392
f 118 115 391
f 392 393 118
f 393 121 118
f 344 123 53
f 52 123 345
f 392 119 393
f 393 119 122
f 393 122 124
f 400 404 396
f 401 402 345
f 398 399 397
f 400 396 397
f 364 336 338
f 336 364 506
f 344 401 345
f 364 395 532
f 399 400 397
f 400 403 404
f 349 351 352
f 352 351 354
f 353 351 350
f 353 354 351
f 344 345 123
f 328 329 473
f 431 388 529
f 394 343 528
f 405 406 531
f 407 405 532
f 477 490 186
f 492 491 454
f 401 411 402
f 411 412 402
f 403 413 404
f 413 414 404
f 417 421 411
f 421 419 411
f 414 420 418
f 420 422 418
f 388 424 387
f 424 423 387
f 424 388 427
f 390 426 389
f 426 425 389
f 442 441 444
f 441 443 444
f 429 389 425
f 431 427 388
f 429 431 389
f 429 427 431
f 490 223 186
f 423 433 428
f 433 438 428
f 425 435 429
f 435 439 429
f 426 436 425
f 436 435 425
f 428 438 427
f 438 437 427
f 429 439 430
f 439 440 430
f 427 441 428
f 441 442 428
f 429 443 427
f 443 441 427
f 428 503 504
f 442 444 503
f 430 444 429
f 444 443 429
f 455 457 461
f 421 445 419
f 422 472 480
f 445 472 553
f 463 464 466
f 464 465 466
f 457 462 461
f 453 451 450
f 453 419 451
f 455 461 451
f 456 458 448
f 448 458 449
f 458 459 449
f 449 459 450
f 459 460 450
f 451 461 452
f 461 462 452
f 449 463 452
f 463 466 452
f 450 464 449
f 464 463 449
f 451 465 450
f 465 464 450
f 452 466 451
f 466 465 451
f 419 468 411
f 468 420 414
f 468 453 420
f 453 468 419
f 329 327 471
f 469 413 403
f 412 469 402
f 470 469 412
f 469 470 413
f 470 414 413
f 411 470 412
f 468 470 411
f 468 414 470
f 422 446 472
f 445 421 472
f 474 401 324
f 404 474 396
f 474 475 401
f 404 475 474
f 473 324 328
f 396 473 397
f 474 473 396
f 473 474 324
f 327 323 476
f 402 476 345
f 345 476 323
f 450 420 453
f 456 450 460
f 446 420 448
f 422 420 446
f 419 445 447
f 450 456 420
f 420 456 448
f 451 419 455
f 419 447 455
f 455 447 457
f 448 449 446
f 447 445 452
f 446 552 553
f 449 452 552
f 447 452 457
f 457 452 462
f 366 477 89
f 477 186 89
f 400 469 403
f 469 400 467
f 476 469 467
f 469 476 402
f 400 471 467
f 400 399 471
f 471 327 467
f 467 327 476
f 472 421 480
f 479 421 417
f 418 422 479
f 479 480 421
f 422 480 479
f 416 414 418
f 414 416 404
f 415 411 401
f 415 417 411
f 479 417 478
f 478 417 415
f 418 478 416
f 478 418 479
f 478 404 416
f 475 404 478
f 401 478 415
f 401 475 478
f 473 398 397
f 473 329 398
f 398 471 399
f 398 329 471
f 376 382 481
f 383 375 384
f 377 373 482
f 385 359 484
f 368 484 359
f 483 484 368
f 481 483 372
f 360 486 369
f 485 486 360
f 484 485 385
f 486 373 369
f 486 482 373
f 384 378 374
f 381 378 384
f 375 379 384
f 379 381 384
f 477 366 487
f 477 487 490
f 454 352 489
f 454 489 495
f 454 366 352
f 454 487 366
f 487 454 491
f 490 487 491
f 409 407 535
f 493 495 488
f 494 495 493
f 494 454 495
f 492 454 494
f 395 337 340
f 338 395 364
f 338 337 395
f 440 436 430
f 436 426 430
f 424 427 434
f 427 437 434
f 423 424 433
f 424 434 433
f 495 489 565
f 185 497 564
f 488 497 493
f 493 497 498
f 498 497 228
f 497 185 228
f 481 499 483
f 382 499 481
f 482 499 382
f 483 499 484
f 486 485 499
f 499 485 484
f 460 458 456
f 458 460 459
f 339 500 506
f 501 341 527
f 423 428 502
f 428 442 503
f 444 430 503
f 503 430 504
f 428 504 502
f 430 502 504
f 430 426 502
f 387 502 432
f 502 387 423
f 502 390 432
f 502 426 390
f 437 433 434
f 438 433 437
f 436 439 435
f 436 440 439
f 500 339 513
f 364 339 506
f 554 556 555
f 509 514 517
f 42 245 508
f 336 506 507
f 508 505 511
f 336 507 510
f 511 515 517
f 501 42 512
f 512 514 518
f 508 245 505
f 510 515 519
f 510 507 509
f 333 33 28
f 500 513 518
f 339 501 513
f 509 500 514
f 511 505 515
f 512 511 514
f 510 509 515
f 514 511 517
f 515 509 517
f 514 500 518
f 515 505 519
f 513 512 518
f 336 516 333
f 333 516 33
f 516 245 33
f 507 500 509
f 507 506 500
f 511 512 508
f 512 42 508
f 510 519 336
f 519 516 336
f 505 245 519
f 519 245 516
f 501 520 521
f 520 259 521
f 239 522 265
f 523 520 557
f 522 239 523
f 521 270 526
f 259 266 521
f 501 521 42
f 239 267 523
f 525 501 524
f 525 524 557
f 501 525 520
f 521 266 270
f 260 271 526
f 523 267 272
f 523 272 520
f 520 272 259
f 270 260 526
f 271 521 526
f 341 46 527
f 355 71 566
f 232 496 318
f 367 496 564
f 528 343 537
f 342 394 528
f 342 347 394
f 347 348 394
f 394 341 343
f 394 348 341
f 409 410 536
f 387 432 538
f 343 364 531
f 341 364 343
f 341 339 364
f 408 410 540
f 340 342 539
f 340 43 342
f 342 43 47
f 536 538 432
f 410 538 536
f 534 432 390
f 432 534 536
f 536 407 409
f 534 407 536
f 389 534 390
f 389 530 534
f 405 534 530
f 534 405 407
f 533 529 388
f 408 538 410
f 533 538 408
f 538 388 387
f 538 533 388
f 539 540 410
f 342 540 539
f 531 537 343
f 537 531 406
f 540 406 408
f 540 537 406
f 410 535 539
f 410 409 535
f 535 532 395
f 535 407 532
f 540 342 537
f 342 528 537
f 533 408 529
f 406 529 408
f 431 529 389
f 530 389 529
f 406 530 529
f 405 530 406
f 395 539 535
f 395 340 539
f 531 532 405
f 364 532 531
f 489 352 541
f 71 355 543
f 358 543 545
f 542 357 546
f 357 544 546
f 546 544 547
f 544 545 547
f 542 546 563
f 547 548 546
f 548 543 355
f 547 543 548
f 545 543 547
f 71 543 320
f 548 355 541
f 544 357 549
f 385 549 550
f 549 357 550
f 544 549 569
f 360 549 385
f 356 550 353
f 542 550 357
f 550 354 353
f 354 550 551
f 352 354 551
f 550 542 551
f 446 449 552
f 452 445 552
f 472 446 553
f 552 445 553
f 501 556 524
f 522 524 554
f 555 556 501
f 501 527 555
f 527 554 555
f 527 46 554
f 554 46 522
f 522 46 265
f 520 525 557
f 524 522 557
f 522 523 557
f 521 271 42
f 327 558 560
f 559 561 558
f 307 561 559
f 307 19 561
f 560 558 562
f 558 561 562
f 306 560 562
f 312 306 562
f 19 562 561
f 19 312 562
f 551 542 563
f 327 560 323
f 323 560 49
f 306 49 560
f 325 559 327
f 21 559 325
f 21 307 559
f 488 564 497
f 495 565 488
f 564 565 367
f 565 564 488
f 231 564 496
f 185 564 316
f 564 231 316
f 546 548 563
f 541 563 548
f 489 541 567
f 367 567 566
f 567 355 566
f 567 541 355
f 565 567 367
f 565 489 567
f 358 320 543
f 76 320 358
f 360 363 568
f 568 358 545
f 361 568 363
f 361 358 568
f 85 361 365
f 85 81 361
f 386 86 365
f 362 86 386
f 82 86 362
f 545 544 569
f 549 360 569
f 568 569 360
f 545 569 568
f 551 541 352
f 563 541 551
f 367 318 496
f 566 318 367
f 71 318 566
s 1
g Nose
usemtl Black
v 0 5.10213 0.74102
v 0 5.0089 0.68284
v 0 5.11867 0.66328
v -0.05992 5.08404 0.69519
v 0.05992 5.08404 0.69519
f 570 573 571
f 572 573 570
f 570 571 574
f 572 570 574
s 1
g Mouth
usemtl Mouth
v 0 4.86426 0.13404
v -0.11767 4.86427 0.13405
v 0 4.93919 0.37064
v -0.10276 4.93386 0.37207
v -0.08606 4.78539 0.24138
v 0 4.79292 0.50742
v -0.0708 4.79418 0.50739
v -0.10013 4.81225 0.46396
v -0.1387 4.84267 0.41298
v -0.10701 4.84013 0.54357
v 0 4.84749 0.58146
v -0.12973 4.84083 0.47942
v -0.05615 4.84063 0.57623
v 0 4.91246 0.5359
v -0.05904 4.91246 0.5359
v 0 4.75765 0.45379
v -0.07085 4.76837 0.4414
v 0.11767 4.86427 0.13405
v 0.10276 4.93386 0.37207
v 0.08606 4.78539 0.24138
v 0.0708 4.79418 0.50739
v 0.10013 4.81225 0.46396
v 0.1387 4.84267 0.41298
v 0.10701 4.84013 0.54357
v 0.12973 4.84083 0.47942
v 0.05615 4.84063 0.57623
v 0.05904 4.91246 0.5359
v 0.07085 4.76837 0.4414
f 583 579 576
f 581 591 582
f 578 583 576
f 580 590 581
f 586 589 584
f 584 589 587
f 589 577 588
f 587 589 585
f 589 588 585
f 589 578 577
f 578 576 577
f 576 575 577
f 590 591 581
f 583 582 591
f 583 591 579
f 589 586 578
f 578 586 583
f 597 592 594
f 595 596 602
f 593 592 597
f 580 595 590
f 599 598 601
f 598 600 601
f 601 588 577
f 600 585 601
f 601 585 588
f 601 577 593
f 593 577 592
f 592 577 575
f 590 595 602
f 597 602 596
f 597 594 602
f 601 593 599
f 593 597 599
s 1
g Tongue
usemtl Tongue
v 0 4.86426 0.13404
v -0.11767 4.86427 0.13405
v -0.08606 4.78539 0.24138
v 0 4.75765 0.45379
v -0.07085 4.76837 0.4414
v 0 4.87466 0.31524
v -0.07197 4.82618 0.42827
v 0 4.83446 0.4345
v -0.09284 4.86075 0.31246
v 0.11767 4.86427 0.13405
v 0.08606 4.78539 0.24138
v 0.07085 4.76837 0.4414
v 0.07197 4.82618 0.42827
v 0.09284 4.86075 0.31246
f 606 609 607
f 605 609 611
f 607 609 605
f 606 610 609
f 609 610 608
f 609 608 611
f 605 611 604
f 604 611 603
f 611 608 603
f 606 614 615
f 613 616 615
f 614 613 615
f 606 615 610
f 615 608 610
f 615 616 608
f 613 612 616
f 612 603 616
f 616 603 608
s 1
g Pupil1
usemtl Black
v -0.36269 5.27432 0.12421
v -0.33912 5.38384 0.16707
v -0.31937 5.2698 0.2013
v -0.31527 5.34757 0.20271
v -0.36226 5.34931 0.13058
v -0.34471 5.24428 0.15788
f 619 620 622
f 618 621 620
f 617 622 621
f 620 621 622
s 1
g Iris1
usemtl Iris
v -0.32577 5.4508 0.17515
v -0.29609 5.21151 0.24259
v -0.36778 5.22182 0.08025
v -0.27834 5.38142 0.24063
v -0.37659 5.38053 0.08702
v -0.32734 5.1668 0.16041
v -0.36269 5.27432 0.12421
v -0.33912 5.38384 0.16707
v -0.31937 5.2698 0.2013
v -0.31527 5.34757 0.20271
v -0.36226 5.34931 0.13058
v -0.34471 5.24428 0.15788
f 628 629 625
f 626 631 624
f 627 630 623
f 631 634 628
f 625 629 627
f 624 631 628
f 623 630 626
f 630 632 626
f 629 633 627
f 628 634 629
f 626 632 631
f 627 633 630
s 1
g Iris2
usemtl Iris
v 0.32577 5.4508 0.17515
v 0.29609 5.21151 0.24259
v 0.36778 5.22182 0.08025
v 0.27834 5.38142 0.24063
v 0.37659 5.38053 0.08702
v 0.32734 5.1668 0.16041
v 0.36269 5.27432 0.12421
v 0.33912 5.38384 0.16707
v 0.31937 5.2698 0.2013
v 0.31527 5.34757 0.20271
v 0.36226 5.34931 0.13058
v 0.34471 5.24428 0.15788
f 640 637 641
f 638 636 643
f 639 635 642
f 643 640 646
f 637 639 641
f 636 640 643
f 635 638 642
f 642 638 644
f 641 639 645
f 640 641 646
f 638 643 644
f 639 642 645
s 1
g Pupil2
usemtl Black
v 0.36269 5.27432 0.12421
v 0.33912 5.38384 0.16707
v 0.31937 5.2698 0.2013
v 0.31527 5.34757 0.20271
v 0.36226 5.34931 0.13058
v 0.34471 5.24428 0.15788
f 649 652 650
f 648 650 651
f 647 651 652
f 650 652 651
s 1
g Eye2
usemtl Eye
v 0.27478 5.09026 0.25027
v 0.39502 5.09998 0.0388
v 0.21614 5.43267 0.29751
v 0.4059 5.46848 -0.03123
v 0.17919 5.32731 0.10726
v 0.32577 5.4508 0.17515
v 0.20436 5.24156 0.31399
v 0.44214 5.27901 -0.06779
v 0.32845 5.53506 0.14162
v 0.29609 5.21151 0.24259
v 0.36778 5.22182 0.08025
v 0.27834 5.38142 0.24063
v 0.37659 5.38053 0.08702
v 0.32734 5.1668 0.16041
f 655 657 659
f 655 658 661
f 657 653 659
f 654 660 663
f 658 656 661
f 655 661 657
f 656 657 661
f 656 660 657
f 657 654 653
f 660 654 657
f 659 653 662
f 663 660 665
f 659 662 664
f 654 663 666
f 665 656 658
f 656 665 660
f 655 664 658
f 664 655 659
f 653 666 662
f 653 654 666
s 1
g Eyelash1
usemtl Black
v -0.20351 5.24122 0.31391
v -0.20922 5.44174 0.31683
v -0.44182 5.27861 -0.06796
v -0.33471 5.55665 0.15827
v -0.28339 5.09751 0.25048
v -0.21535 5.43305 0.29573
v -0.40431 5.46564 -0.02984
v -0.33058 5.52987 0.14142
v -0.50323 5.29278 -0.09673
v -0.20448 5.24262 0.33462
v -0.25037 5.1443 0.31145
v -0.36297 5.55341 0.12438
v -0.43119 5.48508 -0.04769
v -0.46327 5.27202 -0.08595
v -0.43466 5.31431 -0.06068
v -0.45559 5.35618 -0.07938
v -0.4844 5.31359 -0.08289
v -0.51148 5.33926 -0.09954
f 667 676 668
f 668 672 667
f 670 674 672
f 679 682 673
f 677 676 667
f 677 667 671
f 670 672 668
f 678 674 670
f 669 681 680
f 681 683 680
f 680 683 675
f 673 682 681
f 684 683 682
f 682 683 681
f 678 679 673
f 678 673 674
s 1
g Eyelash1_1
usemtl Black
v 0.20351 5.24122 0.31391
v 0.20922 5.44174 0.31683
v 0.44182 5.27861 -0.06796
v 0.33471 5.55665 0.15827
v 0.28339 5.09751 0.25048
v 0.21535 5.43305 0.29573
v 0.40431 5.46564 -0.02984
v 0.33058 5.52987 0.14142
v 0.50323 5.29278 -0.09673
v 0.20448 5.24262 0.33462
v 0.25037 5.1443 0.31145
v 0.36297 5.55341 0.12438
v 0.43119 5.48508 -0.04769
v 0.46327 5.27202 -0.08595
v 0.43466 5.31431 -0.06068
v 0.45559 5.35618 -0.07938
v 0.4844 5.31359 -0.08289
v 0.51148 5.33926 -0.09954
f 685 686 694
f 686 685 690
f 688 690 692
f 697 691 700
f 695 685 694
f 695 689 685
f 688 686 690
f 696 688 692
f 687 698 699
f 699 698 701
f 698 693 701
f 691 699 700
f 702 700 701
f 700 699 701
f 696 691 697
f 696 692 691
]]>
;
MODEL_TEXT[MODEL_TEXT.length] = <![CDATA[
newmtl Black
Kd 0 0 0
Ks 1 1 1
Ka 0 0 0
illum 2
Ns 129
newmtl Tongue
Kd 1 0.4 0.4
Ks 0.2 0.2 0.2
Ka 0 0 0
illum 2
Ns 26
newmtl Eye
Kd 1 1 1
Ks 0.5 0.5 0.5
Ka 0 0 0
illum 2
Ns 129
newmtl Mouth
Kd 0.6 0 0
Ks 0.2 0.2 0.2
Ka 0 0 0
illum 2
Ns 26
newmtl Fur
Kd 0.93333 0.8 0.53333
Ks 0 0 0
Ka 0 0 0
illum 1
newmtl Iris
Kd 0.73725 0.40784 0.10588
Ks 0.5 0.5 0.5
Ka 0 0 0
illum 2
Ns 129
]]>
;
perspectiveAngle = (Math.PI * 0.125);
perspectiveDistance = 7.5;
orthographicScale = 20;
bgColor = 4288269567;
modelName = "Amber";
copyText = "Modelled and programmed by Doom the wolf\nhttp://doom-the-wolf.deviantart.com";
resolutions = [0.0625, 0.125, 0.25, 0.5, 0.666, 1];
curResolution = (resolutions.length - 1);
resolution = resolutions[curResolution];
tF.font = "Arial";
tF.align = TextFormatAlign.RIGHT;
tF.size = 12;
txt.multiline = true;
txt.wordWrap = false;
txt.cacheAsBitmap = true;
txt.selectable = false;
txt.defaultTextFormat = tF;
bmp = null;
stage3d = new Stage3D();
camera = new Camera3D();
model = new Model3D();
light = new Light3D();
light2 = new Light3D();
light3 = new Light3D();
initCenter = [0, 3, 0];
center = initCenter.concat();
hAngle = (-(Math.PI) * 0.5);
vAngle = 0;
dist = perspectiveDistance;
scale = 20;
position = [0, 0, 0];
initHeight = stage.stageHeight;
txt.text = (((((((modelName + "\nClick and drag to rotate.\nHold Ctrl and drag to Zoom.\nHold Shift and drag to scroll.\nPress TAB to change the resolution.\nPress Enter to hide the text\nPress SPACE to reset camera.\n") + "Resolution: ") + Math.floor((stage.stageWidth * resolution)).toString()) + "x") + Math.floor((stage.stageHeight * resolution)).toString()) + "\n") + copyText);
Model3DEditor.readOBJ(MODEL_TEXT[0], model);
defMat = new Material3D("default");
defMat.illuminationModel = 3;
defMat.Kd = [0.5, 0.5, 0.5];
defMat.Ks = [0, 0, 1];
defMat.Ka = [0.2, 0.2, 0];
defMat.Ni = 1.3;
defMat.Ns = 20;
defMat.sharpness = 300;
if (MODEL_TEXT[1]){
Model3DEditor.readMTL(MODEL_TEXT[1], model);
} else {
model.setMaterial(defMat);
};
stage3d.addModel(model);
stage3d.bgColor = bgColor;
stage3d.ambient = [0.2, 0.2, 0.2];
light.color = [0.6, 0.6, 0.6];
light.normal = [-0.8, 1, 0.8];
light2.color = [0.5, 0.5, 0.5];
light2.normal = [1, -0.5, -1];
light3.color = [0.2, 0.2, 0.2];
light3.normal = [0, 0, 1];
stage3d.addLight(light);
stage3d.addLight(light2);
stage3d.addLight(light3);
camera.screen = new Rectangle(0, 0, Math.floor((stage.stageWidth * resolution)), Math.floor((stage.stageHeight * resolution)));
bmp = new Bitmap(camera.canvas);
stage.addChild(bmp);
camera.setPerspective(perspectiveAngle);
stage.addChild(txt);
resize(null);
stage.addEventListener(Event.RESIZE, resize);
EDIT_MODE = 0;
OLD_MX = stage.mouseX;
OLD_MY = stage.mouseY;
stage.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
stage.addEventListener(KeyboardEvent.KEY_DOWN, kDown);
VAR_NAME = "";
}
public function resetView(_arg1:Event=null){
hAngle = (-(Math.PI) * 0.5);
vAngle = 0;
dist = perspectiveDistance;
scale = orthographicScale;
center[0] = initCenter[0];
center[1] = initCenter[1];
center[2] = initCenter[2];
if (camera.isPerspective){
camera.setPerspective(perspectiveAngle);
} else {
camera.setOrthographic(scale);
};
getPosition(hAngle, vAngle, dist, center, position);
camera.lookAt(position, center, [0, 1, 0]);
stage3d.draw(camera);
}
public function getPosition(_arg1:Number, _arg2:Number, _arg3:Number, _arg4:Array, _arg5:Array){
var _local6:Number;
var _local7:Number;
var _local8:Number;
var _local9:Number;
_local6 = Math.cos(_arg1);
_local7 = Math.sin(_arg1);
_local8 = Math.cos(_arg2);
_local9 = Math.sin(_arg2);
_arg5[0] = (_arg4[0] + ((_local6 * _local8) * _arg3));
_arg5[1] = (_arg4[1] + (_local9 * _arg3));
_arg5[2] = (_arg4[2] - ((_local7 * _local8) * _arg3));
}
public function fileLoaded(_arg1:Event){
var _local2:URLLoader;
var _local3:String;
var _local4:String;
var _local5:String;
var _local6:TextField;
_local2 = (_arg1.currentTarget as URLLoader);
_local2.removeEventListener("complete", fileLoaded);
_local2.removeEventListener("ioError", fileFailed);
_local2.removeEventListener("securityError", fileFailed);
_local3 = (((VAR_NAME + "[") + VAR_NAME) + ".length]=<![CDATA[");
_local4 = "]]>;";
_local5 = _local2.data.toString();
_local5 = _local5.replace(/\r/g, "");
_local6 = new TextField();
_local6.width = stage.stageWidth;
_local6.height = stage.stageHeight;
_local6.x = (_local6.y = 0);
_local6.text = ((_local3 + _local5) + _local4);
stage.addChild(_local6);
stage.focus = _local6;
_local6.setSelection(0, _local6.length);
}
public function mDown(_arg1:MouseEvent){
OLD_MX = stage.mouseX;
OLD_MY = stage.mouseY;
OLD_DIST = dist;
if (_arg1.shiftKey){
OLD_X = center[0];
OLD_Y = center[1];
OLD_Z = center[2];
EDIT_MODE = 2;
} else {
if (_arg1.ctrlKey){
OLD_X = dist;
OLD_Y = scale;
EDIT_MODE = 1;
} else {
OLD_X = hAngle;
OLD_Y = vAngle;
EDIT_MODE = 0;
};
};
stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove);
stage.addEventListener(MouseEvent.MOUSE_UP, mUp);
}
public function resize(_arg1:Event){
var _local2:Number;
var _local3:Number;
stage.removeChild(bmp);
bmp.bitmapData = null;
bmp = null;
camera.screen = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
camera.screen = new Rectangle(0, 0, Math.floor((stage.stageWidth * resolution)), Math.floor((stage.stageHeight * resolution)));
getPosition(hAngle, vAngle, dist, center, position);
camera.lookAt(position, center, [0, 1, 0]);
bmp = new Bitmap(camera.canvas);
stage.addChildAt(bmp, 0);
bmp.width = stage.stageWidth;
bmp.height = stage.stageHeight;
if (camera.isPerspective){
camera.setPerspective(((perspectiveAngle * initHeight) / stage.stageHeight));
};
stage3d.draw(camera);
txt.cacheAsBitmap = false;
txt.wordWrap = false;
_local2 = (txt.textWidth + 10);
_local3 = (txt.textHeight + 10);
txt.width = _local2;
txt.height = _local3;
if (_local2 > stage.stageWidth){
_local2 = stage.stageWidth;
txt.wordWrap = true;
txt.width = stage.stageWidth;
_local3 = (txt.height = (txt.textHeight + 10));
};
txt.x = (stage.stageWidth - txt.width);
txt.y = (stage.stageHeight - txt.height);
if (txt.x < 0){
txt.x = 0;
};
if (txt.y < 0){
txt.y = 0;
};
txt.cacheAsBitmap = true;
txt.text = (((((((modelName + "\nClick and drag to rotate.\nHold Ctrl and drag to Zoom.\nHold Shift and drag to scroll.\nPress TAB to change the resolution.\nPress Enter to hide the text\nPress SPACE to reset camera.\n") + "Resolution: ") + Math.floor((stage.stageWidth * resolution)).toString()) + "x") + Math.floor((stage.stageHeight * resolution)).toString()) + "\n") + copyText);
}
public function fileFailed(_arg1:Event){
var _local2:URLLoader;
_local2 = (_arg1.currentTarget as URLLoader);
_local2.removeEventListener("complete", fileLoaded);
_local2.removeEventListener("ioError", fileFailed);
_local2.removeEventListener("securityError", fileFailed);
trace("FILE FAILED!");
}
public function makeEmbeddable(_arg1:String, _arg2:String){
var _local3:URLLoader;
VAR_NAME = _arg2;
_local3 = new URLLoader(new URLRequest(_arg1));
_local3.addEventListener("complete", fileLoaded);
_local3.addEventListener("ioError", fileFailed);
_local3.addEventListener("securityError", fileFailed);
}
public function kDown(_arg1:KeyboardEvent){
switch (_arg1.keyCode){
case Keyboard.SPACE:
resetView();
break;
case Keyboard.ENTER:
txt.visible = !(txt.visible);
break;
case Keyboard.TAB:
curResolution++;
if (curResolution >= resolutions.length){
curResolution = 0;
};
resolution = resolutions[curResolution];
resize(null);
break;
};
}
public function mMove(_arg1:MouseEvent){
var _local2:Number;
var _local3:Number;
var _local4:Number;
var _local5:Number;
var _local6:Number;
var _local7:Number;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
_local2 = (stage.mouseX - OLD_MX);
_local3 = (stage.mouseY - OLD_MY);
if (camera.isPerspective){
_local13 = ((0.01 * OLD_DIST) / perspectiveDistance);
} else {
_local13 = (1 / orthographicScale);
};
switch (EDIT_MODE){
case 2:
_local11 = Math.cos(vAngle);
_local12 = Math.sin(vAngle);
_local9 = Math.cos((hAngle - (Math.PI * 0.5)));
_local10 = Math.sin((hAngle - (Math.PI * 0.5)));
_local4 = _local12;
_local5 = _local11;
_local6 = (((_local9 * _local13) * _local2) + (((_local10 * _local4) * _local3) * _local13));
_local7 = ((_local5 * _local3) * _local13);
_local8 = (((-(_local10) * _local13) * _local2) + (((_local9 * _local4) * _local3) * _local13));
center[0] = (OLD_X + _local6);
center[1] = (OLD_Y + _local7);
center[2] = (OLD_Z + _local8);
break;
case 1:
if (camera.isOrthographic){
_local14 = (OLD_Y * (1 + (_local3 * 0.01)));
_local14 = Math.max(_local14, 0.1);
scale = _local14;
camera.setOrthographic(_local14);
} else {
_local14 = ((-(_local3) * 0.01) * OLD_DIST);
if (_local14 < 0){
_local14 = (_local14 * 0.1);
};
_local14 = (OLD_X + _local14);
_local14 = Math.max(_local14, 0.5);
dist = _local14;
};
break;
case 0:
hAngle = (OLD_X - ((_local2 * Math.PI) * 0.01));
vAngle = (OLD_Y + ((_local3 * Math.PI) * 0.01));
break;
};
getPosition(hAngle, vAngle, dist, center, position);
camera.lookAt(position, center, [0, 1, 0]);
stage3d.draw(camera);
}
public function mUp(_arg1:MouseEvent){
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, mUp);
}
}
}//package modelViewer_fla
Section 2
//Algebra (pixels3d.Algebra)
package pixels3d {
public final class Algebra {
public static function lookAt(_arg1:Array, _arg2:Array, _arg3:Array):Array{
var _local4:Array;
var _local5:Array;
var _local6:Array;
var _local7:Array;
_local4 = [(_arg1[0] - _arg2[0]), (_arg1[1] - _arg2[1]), (_arg1[2] - _arg2[2])];
normalize(_local4);
_local5 = crossProduct(_arg3, _local4);
normalize(_local5);
_local6 = crossProduct(_local4, _local5);
_local5[3] = (_local6[3] = (_local4[3] = 0));
_local7 = [[_local5[0], _local6[0], _local4[0], _arg1[0]], [_local5[1], _local6[1], _local4[1], _arg1[1]], [_local5[2], _local6[2], _local4[2], _arg1[2]], [0, 0, 0, 1]];
return (inverse(_local7));
}
public static function perspective(_arg1:Number, _arg2:Number, _arg3:Number, _arg4:Number):Array{
var _local5:Number;
var _local6:Number;
var _local7:Array;
_local5 = Math.tan(((Math.PI * 0.5) - _arg1));
_local6 = (1 / (_arg3 - _arg4));
_local7 = identity(4);
_local7[0][0] = (_local5 / _arg2);
_local7[1][1] = _local5;
_local7[2][2] = ((_arg3 + _arg4) * _local6);
_local7[3][3] = 0;
_local7[2][3] = (((2 * _arg3) * _arg4) * _local6);
_local7[3][2] = -1;
return (_local7);
}
public static function transformPoint(_arg1:Array, _arg2:Array):Array{
var _local3:int;
var _local4:int;
var _local5:Array;
var _local6:Number;
if (_arg1.length != 4){
throw ("ERROR! Vector is not of size 4!");
};
_local5 = new Array(4);
_local5[0] = ((((_arg1[0] * _arg2[0][0]) + (_arg1[1] * _arg2[0][1])) + (_arg1[2] * _arg2[0][2])) + _arg2[0][3]);
_local5[1] = ((((_arg1[0] * _arg2[1][0]) + (_arg1[1] * _arg2[1][1])) + (_arg1[2] * _arg2[1][2])) + _arg2[1][3]);
_local5[2] = ((((_arg1[0] * _arg2[2][0]) + (_arg1[1] * _arg2[2][1])) + (_arg1[2] * _arg2[2][2])) + _arg2[2][3]);
_local5[3] = ((((_arg1[0] * _arg2[3][0]) + (_arg1[1] * _arg2[3][1])) + (_arg1[2] * _arg2[3][2])) + _arg2[3][3]);
if (_local5[3] != 1){
_local6 = (1 / _local5[3]);
_local5[0] = (_local5[0] * _local6);
_local5[1] = (_local5[1] * _local6);
_local5[2] = (_local5[2] * _local6);
_local5[3] = 1;
};
return (_local5);
}
public static function rotateY(_arg1:Number):Array{
var _local2:Array;
var _local3:Number;
var _local4:Number;
_local2 = identity(4);
_local3 = Math.sin(_arg1);
_local4 = Math.cos(_arg1);
_local2[0][0] = _local4;
_local2[0][2] = _local3;
_local2[2][0] = -(_local3);
_local2[2][2] = _local4;
return (_local2);
}
public static function dotProduct(_arg1:Array, _arg2:Array):Number{
var _local3:int;
var _local4:Number;
_local4 = 0;
_local3 = 0;
while (_local3 < _arg1.length) {
_local4 = (_local4 + (_arg1[_local3] * _arg2[_local3]));
_local3++;
};
return (_local4);
}
public static function adjoint(_arg1:Array):Array{
var _local2:int;
var _local3:Array;
var _local4:Array;
var _local5:Number;
var _local6:int;
var _local7:int;
_local2 = _arg1.length;
_local3 = identity(_local2);
_local6 = 0;
while (_local6 < _local2) {
_local7 = 0;
while (_local7 < _local2) {
_local4 = cofactors(_arg1, _local6, _local7);
_local5 = determinant(_local4);
if (((_local6 + _local7) % 2)){
_local3[_local6][_local7] = -(_local5);
} else {
_local3[_local6][_local7] = _local5;
};
_local7++;
};
_local6++;
};
return (_local3);
}
public static function scale(_arg1:Number, _arg2:Number, _arg3:Number):Array{
var _local4:Array;
_local4 = identity(4);
_local4[0][0] = _arg1;
_local4[1][1] = _arg2;
_local4[2][2] = _arg3;
return (_local4);
}
public static function vectorMatrixProduct(_arg1:Array, _arg2:Array):Array{
var _local3:Array;
var _local4:int;
_local3 = new Array(_arg1.length);
_local4 = 0;
while (_local4 < _arg1.length) {
_local3[_local4] = dotProduct(_arg1, _arg2[_local4]);
_local4++;
};
return (_local3);
}
public static function rotateX(_arg1:Number):Array{
var _local2:Array;
var _local3:Number;
var _local4:Number;
_local2 = identity(4);
_local3 = Math.sin(_arg1);
_local4 = Math.cos(_arg1);
_local2[1][1] = _local4;
_local2[1][2] = -(_local3);
_local2[2][1] = _local3;
_local2[2][2] = _local4;
return (_local2);
}
public static function normalize(_arg1:Array):void{
var _local2:Number;
var _local3:int;
_local2 = norm(_arg1);
if (!_local2){
_arg1[0] = 0;
_arg1[1] = 0;
_arg1[2] = 0;
return;
};
_local3 = 0;
while (_local3 < _arg1.length) {
_arg1[_local3] = (_arg1[_local3] / _local2);
_local3++;
};
}
public static function matrixProduct(_arg1:Array, _arg2:Array):Array{
var _local3:int;
var _local4:int;
var _local5:int;
var _local6:int;
var _local7:int;
var _local8:Array;
var _local9:int;
var _local10:Number;
var _local11:Number;
_local5 = _arg1[0].length;
_local6 = _arg1.length;
_local7 = _arg2.length;
_local8 = new Array(_local7);
_local4 = 0;
while (_local4 < _local7) {
_local8[_local4] = new Array(_local5);
_local4++;
};
_local3 = 0;
while (_local3 < _local5) {
_local4 = 0;
while (_local4 < _local7) {
_local11 = 0;
_local9 = 0;
while (_local9 < _local6) {
_local11 = (_local11 + (_arg1[_local9][_local3] * _arg2[_local4][_local9]));
_local9++;
};
_local8[_local4][_local3] = _local11;
_local4++;
};
_local3++;
};
return (_local8);
}
public static function crossProduct(_arg1:Array, _arg2:Array):Array{
var _local3:Array;
_local3 = new Array(3);
_local3[0] = ((_arg1[1] * _arg2[2]) - (_arg1[2] * _arg2[1]));
_local3[1] = ((_arg1[2] * _arg2[0]) - (_arg1[0] * _arg2[2]));
_local3[2] = ((_arg1[0] * _arg2[1]) - (_arg1[1] * _arg2[0]));
return (_local3);
}
public static function inverse(_arg1:Array):Array{
var _local2:int;
var _local3:Array;
var _local4:Number;
var _local5:Array;
var _local6:Number;
var _local7:int;
var _local8:int;
_local2 = _arg1.length;
_local3 = identity(_local2);
_local4 = determinant(_arg1);
if (!_local4){
return (_local3);
};
_local5 = adjoint(_arg1);
_local6 = (1 / _local4);
_local7 = 0;
while (_local7 < _local2) {
_local8 = 0;
while (_local8 < _local2) {
_local3[_local7][_local8] = (_local5[_local8][_local7] * _local6);
_local8++;
};
_local7++;
};
return (_local3);
}
public static function plainPerspective(_arg1:Number):Array{
var _local2:Array;
_local2 = identity(4);
_local2[3][2] = (1 / _arg1);
return (_local2);
}
public static function determinant(_arg1:Array):Number{
var _local2:int;
var _local3:Array;
var _local4:Number;
var _local5:int;
_local2 = _arg1.length;
if (_local2 == 2){
return (((_arg1[0][0] * _arg1[1][1]) - (_arg1[0][1] * _arg1[1][0])));
};
if (_local2 == 1){
return (_arg1[0][0]);
};
_local4 = 0;
_local5 = 0;
while (_local5 < _local2) {
_local3 = cofactors(_arg1, _local5, 0);
if ((_local5 % 2)){
_local4 = (_local4 - (_arg1[_local5][0] * determinant(_local3)));
} else {
_local4 = (_local4 + (_arg1[_local5][0] * determinant(_local3)));
};
_local5++;
};
return (_local4);
}
public static function copyMatrix(_arg1:Array):Array{
var _local2:int;
var _local3:int;
var _local4:int;
var _local5:int;
var _local6:Array;
_local4 = _arg1[0].length;
_local5 = _arg1.length;
_local6 = new Array(_local5);
_local3 = 0;
while (_local3 < _local5) {
_local6[_local3] = new Array(_local4);
_local2 = 0;
while (_local2 < _local4) {
_local6[_local3][_local2] = _arg1[_local3][_local2];
_local2++;
};
_local3++;
};
return (_local6);
}
public static function orthographic(_arg1:Number, _arg2:Number):Array{
var _local3:Array;
_local3 = identity(4);
_local3[2][2] = (-2 / (_arg2 - _arg1));
return (_local3);
}
public static function cofactors(_arg1:Array, _arg2:int, _arg3:int):Array{
var _local4:int;
var _local5:Array;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
_local4 = _arg1.length;
_local5 = identity((_local4 - 1));
_local6 = 0;
while (_local6 < (_local4 - 1)) {
_local8 = ((_local6)<_arg2) ? _local6 : (_local6 + 1);
_local7 = 0;
while (_local7 < (_local4 - 1)) {
_local9 = ((_local7)<_arg3) ? _local7 : (_local7 + 1);
_local5[_local6][_local7] = _arg1[_local8][_local9];
_local7++;
};
_local6++;
};
return (_local5);
}
public static function transpose(_arg1:Array):Array{
var _local2:Number;
var _local3:Array;
var _local4:int;
var _local5:int;
_local2 = _arg1.length;
_local3 = identity(_local2);
_local4 = 0;
while (_local4 < _local2) {
_local5 = 0;
while (_local5 < _local2) {
_local3[_local4][_local5] = _arg1[_local5][_local4];
_local5++;
};
_local4++;
};
return (_local3);
}
public static function norm(_arg1:Array):Number{
var _local2:int;
var _local3:Number;
var _local4:Array;
_local3 = 0;
_local4 = new Array(3);
_local2 = 0;
while (_local2 < _arg1.length) {
_local3 = (_local3 + (_arg1[_local2] * _arg1[_local2]));
_local2++;
};
_local3 = Math.sqrt(_local3);
return (_local3);
}
public static function translate(_arg1:Number, _arg2:Number, _arg3:Number):Array{
var _local4:Array;
_local4 = identity(4);
_local4[0][3] = _arg1;
_local4[1][3] = _arg2;
_local4[2][3] = _arg3;
return (_local4);
}
public static function identity(_arg1:int=4):Array{
var _local2:int;
var _local3:int;
var _local4:Array;
_local4 = new Array(_arg1);
_local2 = 0;
while (_local2 < _arg1) {
_local4[_local2] = new Array(_arg1);
_local3 = 0;
while (_local3 < _arg1) {
_local4[_local2][_local3] = 0;
_local3++;
};
_local4[_local2][_local2] = 1;
_local2++;
};
return (_local4);
}
public static function rotateZ(_arg1:Number):Array{
var _local2:Array;
var _local3:Number;
var _local4:Number;
_local2 = identity(4);
_local3 = Math.sin(_arg1);
_local4 = Math.cos(_arg1);
_local2[0][0] = _local4;
_local2[0][1] = -(_local3);
_local2[1][0] = _local3;
_local2[1][1] = _local4;
return (_local2);
}
}
}//package pixels3d
Section 3
//Camera3D (pixels3d.Camera3D)
package pixels3d {
import flash.geom.*;
import flash.display.*;
public final class Camera3D {
private var _view:Array;
private var _position:Array;
private var _scale:Number;
public var screenSize:Rectangle;
private var _screenDist:Number;
private var _screen:Rectangle;
var zBuffer:Array;
private var _projection:Array;
private var _fieldOfView:int;
private var _ortho:Boolean;
private var _zBufferLen:int;
private var _canvas:BitmapData;
public function Camera3D(){
_position = [0, 0, 0, 1];
zBuffer = null;
_screen = new Rectangle();
_screenDist = Infinity;
_canvas = null;
_view = Algebra.identity();
setOrthographic();
}
public function setPerspective(_arg1:Number, _arg2:Number=1, _arg3:Number=2000){
_fieldOfView = (2 * _arg1);
_screenDist = ((Math.cos(_arg1) * _screen.height) * 0.5);
_scale = 1;
_ortho = false;
_projection = Algebra.perspective(_arg1, (_screen.width / _screen.height), _arg2, _arg3);
_projection = Algebra.matrixProduct(_projection, Algebra.scale((_screen.width * 0.5), (_screen.height * 0.5), 1));
}
public function get isOrthographic():Boolean{
return (_ortho);
}
public function get screenDist():Number{
return (_screenDist);
}
public function get isPerspective():Boolean{
return (!(_ortho));
}
public function get canvas():BitmapData{
return (_canvas);
}
public function get scale():Number{
return (_scale);
}
public function set screen(_arg1:Rectangle){
var _local2:*;
var _local3:int;
_screen = _arg1.clone();
screenSize = _screen.clone();
screenSize.x = (screenSize.y = 0);
_zBufferLen = (_screen.width * _screen.height);
zBuffer = [];
resetZBuffer();
if (_canvas != null){
_canvas.dispose();
};
_canvas = new BitmapData(_screen.width, _screen.height);
}
public function resetZBuffer(){
var _local1:Number;
var _local2:int;
_local1 = Infinity;
_local2 = 0;
while (_local2 < _zBufferLen) {
zBuffer[_local2] = _local1;
zBuffer[(_local2 + 1)] = _local1;
zBuffer[(_local2 + 2)] = _local1;
zBuffer[(_local2 + 3)] = _local1;
zBuffer[(_local2 + 4)] = _local1;
zBuffer[(_local2 + 5)] = _local1;
zBuffer[(_local2 + 6)] = _local1;
zBuffer[(_local2 + 7)] = _local1;
zBuffer[(_local2 + 8)] = _local1;
zBuffer[(_local2 + 9)] = _local1;
zBuffer[(_local2 + 10)] = _local1;
zBuffer[(_local2 + 11)] = _local1;
zBuffer[(_local2 + 12)] = _local1;
zBuffer[(_local2 + 13)] = _local1;
zBuffer[(_local2 + 14)] = _local1;
zBuffer[(_local2 + 15)] = _local1;
zBuffer[(_local2 + 16)] = _local1;
zBuffer[(_local2 + 17)] = _local1;
zBuffer[(_local2 + 18)] = _local1;
zBuffer[(_local2 + 19)] = _local1;
_local2 = (_local2 + 20);
};
}
public function get view():Array{
return (_view);
}
public function get projection():Array{
return (_projection);
}
public function get position():Array{
return (_position);
}
public function setOrthographic(_arg1:Number=1, _arg2:Number=0, _arg3:Number=2000){
_fieldOfView = Math.PI;
_scale = _arg1;
_ortho = true;
_screenDist = 0;
_projection = Algebra.orthographic(_arg2, _arg3);
_projection = Algebra.matrixProduct(_projection, Algebra.scale(_arg1, _arg1, 1));
}
public function get screen():Rectangle{
return (_screen.clone());
}
public function clear(){
if (_canvas != null){
_canvas.dispose();
_canvas = null;
};
_view = (zBuffer = (_projection = null));
}
public function get fieldOfView():Number{
return (_fieldOfView);
}
public function lookAt(_arg1:Array, _arg2:Array=null, _arg3:Array=null){
if (_arg2 == null){
_arg2 = [0, 0, 0];
};
if (_arg3 == null){
_arg3 = [0, 1, 0];
};
_position[0] = _arg1[0];
_position[1] = _arg1[1];
_position[2] = _arg1[2];
_view = Algebra.lookAt(position, _arg2, _arg3);
}
}
}//package pixels3d
Section 4
//Light3D (pixels3d.Light3D)
package pixels3d {
public final class Light3D {
public var color:Array;
private var _normal:Array;
public var type:int;
public static const T_FOCAL:int = 1;
public static const T_POINT:int = 0;
public function Light3D(){
color = [1, 1, 1, 1];
_normal = [0, 1, 0];
type = T_FOCAL;
}
public function get position():Array{
return (_normal);
}
public function set normal(_arg1:Array){
_normal = _arg1;
}
public function set position(_arg1:Array){
_normal = _arg1;
}
public function get normal():Array{
return (_normal);
}
}
}//package pixels3d
Section 5
//Material3D (pixels3d.Material3D)
package pixels3d {
import flash.display.*;
public class Material3D {
public var Ka:Array;
public var sharpness:Number;
public var name:String;
public var Ks:Array;
public var emissive:Array;
public var illuminationModel:int;
public var texture:BitmapData;
public var Ni:Number;
public var Ns:Number;
public var Kd:Array;
public function Material3D(_arg1:String){
name = _arg1;
illuminationModel = 0;
Ka = [0, 0, 0];
Kd = [1, 1, 1];
Ks = [1, 1, 1];
emissive = [0, 0, 0];
Ns = 1;
sharpness = 60;
Ni = 1;
texture = null;
}
public function clone():Material3D{
var _local1:Material3D;
_local1 = new Material3D(name);
_local1.illuminationModel = illuminationModel;
_local1.Ka = Ka.concat();
_local1.Kd = Kd.concat();
_local1.Ks = Ks.concat();
_local1.emissive = emissive.concat();
_local1.Ns = Ns;
_local1.sharpness = sharpness;
_local1.Ni = Ni;
_local1.texture = texture;
return (_local1);
}
public function copy(_arg1:Material3D):void{
_arg1.name = name;
_arg1.illuminationModel = illuminationModel;
_arg1.Ka[0] = Ka.concat();
_arg1.Kd[0] = Kd.concat();
_arg1.Ks[0] = Ks.concat();
_arg1.emissive = emissive.concat();
_arg1.Ns = Ns;
_arg1.sharpness = sharpness;
_arg1.Ni = Ni;
_arg1.texture = texture;
}
}
}//package pixels3d
Section 6
//Model3D (pixels3d.Model3D)
package pixels3d {
import flash.display.*;
import flash.events.*;
import flash.net.*;
public final class Model3D extends EventDispatcher {
private var __blinnRS:Array;
private var _points:Array;
public var wireframe:Boolean;
private var __curScrFace:Array;
public var _loaded:Boolean;
private var __specularSum:Array;
private var _globalFaceNormals:Array;
private var _faceGroups:Array;
private var __canvas:BitmapData;
private var __pointToObserver:Array;
private var _projectedPoints:Array;
private var _globalPoints:Array;
private var __scrH:int;
private var __blinnLV:Array;
private var _scale:Array;
private var __blinnSum:Array;
private var _localPointNormals:Array;
private var _localFaceNormals:Array;
private var __scrW:int;
private var _facesPerPoint:Array;
private var _materialNames:Array;
private var __prop:Array;
private var __diffuseSum:Array;
private var __faceArea:Number;
public var visible:Boolean;
public var cull:Boolean;
private var __zBuffer:Array;
private var __scrW2:int;
private var _position:Array;
public var _lastObjFileName:String;
public var name:String;
private var __pointToLight:Array;
private var __normals:Array;
private var _globalPointNormals:Array;
private var __curMaterial:Material3D;
private var __blinnH:Array;
private var __lig:Array;
private var _materials:Array;
private var __scrFaceOrdered:Array;
private var __point:Array;
private var __scrH2:int;
public var _pendingMaterials:Boolean;
private var _faces:Array;
private var __invFaceArea:Number;
private var __points:Array;
private var _screenFaceNormals:Array;
private var _pointGroups:Array;
private var __normal:Array;
private var __colorSum:Array;
private var __amb:Array;
private var _rotation:Array;
private var _matrix:Array;
private var __camPos:Array;
private var __curFace:Array;
private var __cam:Camera3D;
private var __pointToReflect:Array;
private var _groups:Array;
public function Model3D(){
name = "default";
_pendingMaterials = false;
_loaded = true;
_lastObjFileName = "";
wireframe = false;
visible = true;
cull = true;
_position = [0, 0, 0, 1];
_rotation = [0, 0, 0, 1];
_scale = [1, 1, 1, 1];
_matrix = Algebra.identity();
_points = [];
_globalPoints = [];
_projectedPoints = [];
_localPointNormals = [];
_globalPointNormals = [];
_screenFaceNormals = [];
_facesPerPoint = [];
_faces = [];
_localFaceNormals = [];
_globalFaceNormals = [];
_materials = [];
_materialNames = [];
_materialNames[0] = "";
_materials[""] = new Material3D("");
_groups = [];
_pointGroups = [];
_faceGroups = [];
__cam = null;
__camPos = null;
__canvas = null;
__zBuffer = null;
__lig = null;
__amb = [0, 0, 0];
__curFace = [-1, -1, -1];
__curMaterial = null;
__curScrFace = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
__scrW = (__scrW2 = (__scrH = __scrH2));
__faceArea = 0;
__invFaceArea = 0;
__normals = [null, null, null];
__points = [null, null, null];
__scrFaceOrdered = [null, null, null];
__normal = [0, 0, 0];
__point = [0, 0, 0];
__prop = [0, 0, 0];
__colorSum = [0, 0, 0];
__diffuseSum = [0, 0, 0];
__specularSum = [0, 0, 0];
__pointToLight = [0, 0, 0];
__pointToObserver = [0, 0, 0];
__pointToReflect = [0, 0, 0];
__blinnSum = [0, 0, 0];
__blinnRS = [0, 0, 0];
__blinnH = [0, 0, 0];
__blinnLV = [0, 0, 0];
}
public function get loaded():Boolean{
return (_loaded);
}
private function mtlLoaded(_arg1:Event):void{
var _local2:URLLoader;
_local2 = (_arg1.currentTarget as URLLoader);
Model3DEditor.readMTL(_local2.data, this);
_pendingMaterials = false;
_loaded = true;
_lastObjFileName = "";
dispatchEvent(new Event("complete"));
}
public function set rotation(_arg1:Array):void{
_rotation = _arg1.concat();
}
public function removeFaceFromGroup(_arg1:String, _arg2:int):void{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
if ((((_arg2 < 0)) || ((_arg2 >= _faces.length)))){
return;
};
_local3 = _faceGroups[_arg2];
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
_local3.splice(_local5, 1);
return;
};
_local5++;
};
}
public function getGroupsFromFace(_arg1:int):Array{
if ((((_arg1 < 0)) || ((_arg1 >= _faces.length)))){
return ([]);
};
return (_faceGroups[_arg1].concat());
}
public function getPointsFromGroup(_arg1:String):Array{
var _local2:int;
var _local3:int;
var _local4:Array;
_local3 = _points.length;
_local4 = [];
_local2 = 0;
while (_local2 < _local3) {
if (pointInGroup(_arg1, _local2)){
_local4.push(_local2);
};
_local2++;
};
return (_local4);
}
public function setGlobalAsLocal():void{
var _local1:int;
_local1 = 0;
while (_local1 < _points.length) {
_points[_local1][0] = _globalPoints[_local1][0];
_points[_local1][1] = _globalPoints[_local1][1];
_points[_local1][2] = _globalPoints[_local1][2];
_points[_local1][3] = 1;
_local1++;
};
computeLocalNormals();
_position = [0, 0, 0, 1];
_rotation = [0, 0, 0, 1];
_scale = [1, 1, 1, 1];
updateMatrix();
}
public function get position():Array{
return (_position);
}
public function get materials():Array{
return (_materials);
}
public function loadOBJ(_arg1:String):void{
var _local2:URLLoader;
_loaded = false;
_lastObjFileName = _arg1;
_local2 = new URLLoader();
_local2.addEventListener(Event.COMPLETE, objLoaded);
_local2.addEventListener(IOErrorEvent.IO_ERROR, objIOError);
_local2.addEventListener(SecurityErrorEvent.SECURITY_ERROR, objSecurityError);
_local2.load(new URLRequest(_arg1));
}
public function removeMaterialByName(_arg1:String){
var _local2:Number;
var _local3:int;
if (!name.length){
return;
};
if (!_materials[_arg1]){
return;
};
delete _materials[_arg1];
_local2 = _faces.length;
_local3 = 0;
while (_local3 < _local2) {
if (_faces[_local3].material == _arg1){
_faces[_local3].material = "";
};
_local3++;
};
_local2 = _materialNames.length;
_local3 = 0;
while (_local3 < _local2) {
if (_materialNames[_local3] == _arg1){
_materialNames.splice(_local3, 1);
return;
};
_local3++;
};
}
private function computeFaceNormal(_arg1:Array, _arg2:int, _arg3:Array):void{
var _local4:*;
var _local5:*;
var _local6:Array;
var _local7:*;
var _local8:Array;
var _local9:int;
_local4 = _arg3[_faces[_arg2][0]];
_local5 = _arg3[_faces[_arg2][1]];
_local6 = _arg3[_faces[_arg2][2]];
_local7 = [(_local5[0] - _local4[0]), (_local5[1] - _local4[1]), (_local5[2] - _local4[2])];
_local8 = [(_local6[0] - _local4[0]), (_local6[1] - _local4[1]), (_local6[2] - _local4[2])];
_arg1[_arg2] = Algebra.crossProduct(_local7, _local8);
Algebra.normalize(_arg1[_arg2]);
}
public function faceInGroup(_arg1:String, _arg2:int):Boolean{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return (false);
};
if ((((_arg2 < 0)) || ((_arg2 >= _faces.length)))){
return (false);
};
_local3 = _faceGroups[_arg2];
if (!_local3){
return (false);
};
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
return (true);
};
_local5++;
};
return (false);
}
public function computeGlobalPoints():void{
var _local1:int;
var _local2:int;
var _local3:Array;
_local2 = _points.length;
_local1 = 0;
while (_local1 < _local2) {
_globalPoints[_local1] = Algebra.transformPoint(_points[_local1], _matrix);
_local3 = _globalPoints[_local1];
_local1++;
};
computeGlobalNormals();
}
public function draw(_arg1:Camera3D, _arg2:Array, _arg3:Array):void{
var _local4:int;
var _local5:uint;
var _local6:int;
__cam = _arg1;
__camPos = __cam.position;
__canvas = __cam.canvas;
__zBuffer = __cam.zBuffer;
__scrW = __cam.screen.width;
__scrW2 = (__scrW >> 1);
__scrH = __cam.screen.height;
__scrH2 = (__scrH >> 1);
__lig = _arg2;
__amb = _arg3.concat();
computeScreenPoints(_arg1.view, _arg1.projection);
_local6 = _faces.length;
if (wireframe){
_local4 = 0;
while (_local4 < _local6) {
if (cull){
computeFaceNormal(_screenFaceNormals, _local4, _projectedPoints);
//unresolved if
} else {
__curFace = _faces[_local4];
if (!__curFace.visible){
} else {
__curMaterial = _materials[__curFace.material];
_local5 = ((((__curMaterial.Kd[0] * 0xFF) << 16) | ((__curMaterial.Kd[1] * 0xFF) << 8)) | (__curMaterial.Kd[2] * 0xFF));
drawLine(__curFace[0], __curFace[1], _local5);
drawLine(__curFace[1], __curFace[2], _local5);
drawLine(__curFace[2], __curFace[0], _local5);
};
};
_local4++;
};
} else {
_local4 = 0;
while (_local4 < _local6) {
if (cull){
computeFaceNormal(_screenFaceNormals, _local4, _projectedPoints);
//unresolved if
} else {
drawFace(_local4);
};
_local4++;
};
};
}
public function get faceNormals():Array{
return (_localFaceNormals);
}
public function clone():Model3D{
var _local1:int;
var _local2:int;
var _local3:Model3D;
var _local4:Array;
var _local5:Array;
var _local6:int;
var _local7:int;
_local3 = new Model3D();
_local3.visible = visible;
_local3.cull = cull;
_local3.wireframe = wireframe;
_local3._rotation = _rotation.concat();
_local3._position = _position.concat();
_local3._scale = _scale.concat();
_local3._groups = _groups.concat();
_local1 = 0;
while (_local1 < _materialNames.length) {
_local3.addMaterial(_materials[_materialNames[_local1]]);
_local1++;
};
_local1 = 0;
while (_local1 < _points.length) {
_local3._points[_local1] = _points[_local1].concat();
_local4 = getGroupsFromPoint(_local1);
_local6 = _local4.length;
_local2 = 0;
while (_local2 < _local6) {
_local3.addPointToGroup(_local4[_local2], _local1);
_local2++;
};
_local1++;
};
_local1 = 0;
while (_local1 < _faces.length) {
_local3._faces[_local1] = Model3DEditor.copyFace(_faces[_local1]);
_local5 = getGroupsFromFace(_local1);
_local7 = _local5.length;
_local2 = 0;
while (_local2 < _local7) {
_local3.addPointToGroup(_local5[_local2], _local1);
_local2++;
};
_local1++;
};
_local3.updateModel();
_local3.updateMatrix();
return (_local3);
}
public function addFaceToGroup(_arg1:String, _arg2:int):void{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
if ((((_arg2 < 0)) || ((_arg2 >= _faces.length)))){
return;
};
_local3 = _faceGroups[_arg2];
if (!_local3){
_local3 = (_faceGroups[_arg2] = []);
};
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
return;
};
_local5++;
};
_local3.push(_arg1);
addGroup(_arg1);
}
public function computeLocalNormals():void{
var _local1:int;
var _local2:int;
var _local3:int;
_local2 = _faces.length;
_local3 = _points.length;
_local1 = 0;
while (_local1 < _local2) {
computeFaceNormal(_localFaceNormals, _local1, _points);
_local1++;
};
_local1 = 0;
while (_local1 < _local3) {
computePointNormal(_localPointNormals, _local1, _localFaceNormals);
_local1++;
};
computeGlobalPoints();
}
public function getGroupsFromPoint(_arg1:int):Array{
if ((((_arg1 < 0)) || ((_arg1 >= _points.length)))){
return ([]);
};
return (_pointGroups[_arg1].concat());
}
public function get pendingMaterials():Boolean{
return (_pendingMaterials);
}
public function get globalPoints():Array{
return (_globalPoints);
}
public function clean():void{
_globalPoints = [];
_projectedPoints = [];
_localPointNormals = [];
_globalPointNormals = [];
_localFaceNormals = [];
_globalFaceNormals = [];
updateModel();
updateMatrix();
}
public function addPointToGroup(_arg1:String, _arg2:int):void{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
if ((((_arg2 < 0)) || ((_arg2 >= _points.length)))){
return;
};
_local3 = _pointGroups[_arg2];
if (!_local3){
_local3 = (_pointGroups[_arg2] = []);
};
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
return;
};
_local5++;
};
addGroup(_arg1);
_local3.push(_arg1);
}
public function clear():void{
_points = [];
_faces = [];
_materials = [];
_materialNames = [];
_rotation = [0, 0, 0];
_position = [0, 0, 0];
_scale = [1, 1, 1];
_materials[""] = new Material3D("");
_materialNames[0] = "";
clean();
}
public function removeGroup(_arg1:String):void{
var _local2:Array;
var _local3:Array;
var _local4:int;
var _local5:int;
var _local6:int;
var _local7:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
_local2 = getPointsFromGroup(_arg1);
_local3 = getFacesFromGroup(_arg1);
_local4 = _local2.length;
_local5 = _local3.length;
_local6 = 0;
while (_local6 < _local4) {
removePointFromGroup(_arg1, _local2[_local6]);
_local6++;
};
_local6 = 0;
while (_local6 < _local4) {
removeFaceFromGroup(_arg1, _local2[_local6]);
_local6++;
};
_local7 = _groups.length;
_local6 = 0;
while (_local6 < _local7) {
if (_groups[_local6] == _arg1){
_groups.splice(_local6, 1);
return;
};
_local6++;
};
}
public function get scale():Array{
return (_scale);
}
public function get projectedPoints():Array{
return (_projectedPoints);
}
public function get screenFaceNormals():Array{
return (_screenFaceNormals);
}
public function get rotation():Array{
return (_rotation);
}
public function set position(_arg1:Array):void{
_position = _arg1.concat();
}
public function addGroup(_arg1:String):void{
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
if (groupExists(_arg1)){
return;
};
_groups.push(_arg1);
}
public function get materialNames():Array{
return (_materialNames.concat());
}
private function drawLine(_arg1:int, _arg2:int, _arg3:uint){
var _local4:*;
var _local5:int;
var _local6:Array;
var _local7:Array;
var _local8:int;
var _local9:int;
var _local10:int;
var _local11:int;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:int;
var _local16:int;
var _local17:Number;
var _local18:int;
var _local19:int;
var _local20:*;
var _local21:*;
var _local22:*;
var _local23:int;
var _local24:int;
var _local25:int;
var _local26:int;
var _local27:Boolean;
_local6 = _projectedPoints[_arg1];
_local7 = _projectedPoints[_arg2];
_local8 = _local6[0];
_local10 = _local7[0];
_local9 = _local6[1];
_local11 = _local7[1];
_local13 = _local6[2];
_local14 = _local7[2];
if ((((_local13 < -1)) || ((_local14 < -1)))){
return;
};
if ((((_local13 > 1)) || ((_local14 > 1)))){
return;
};
_local15 = (_local10 - _local8);
_local16 = (_local11 - _local9);
_local17 = (_local14 - _local13);
_local18 = Math.abs(_local15);
_local19 = Math.abs(_local16);
if (_local15 < 0){
_local15 = -(_local15);
};
if (_local16 < 0){
_local16 = -(_local16);
};
_local20 = ((_local8)<_local10) ? 1 : -1;
_local21 = ((_local9)<_local11) ? 1 : -1;
_local4 = (_local15 - _local16);
_local25 = _local8;
_local26 = _local9;
_local27 = (_local18 < _local19);
while (1) {
_local22 = (_local8 + __scrW2);
_local23 = (__scrH2 - _local9);
if ((((_local22 < 0)) && ((_local20 < 0)))){
return;
};
if ((((_local23 < 0)) && ((_local21 > 0)))){
return;
};
if ((((_local22 > __scrW)) && ((_local20 > 0)))){
return;
};
if ((((_local23 > __scrH)) && ((_local21 < 0)))){
return;
};
if ((((((((_local22 > 0)) && ((_local23 > 0)))) && ((_local22 < __scrW)))) && ((_local23 < __scrH)))){
_local24 = ((_local22 * __scrH) + _local23);
if (_local27){
_local12 = (_local13 + ((_local17 * (_local9 - _local26)) / Number((_local11 - _local26))));
} else {
_local12 = (_local13 + ((_local17 * (_local8 - _local25)) / Number((_local10 - _local25))));
};
if (isNaN(_local12)){
_local12 = _local13;
};
if ((((((_local12 >= -1)) && ((_local12 <= 1)))) && ((__zBuffer[_local24] >= _local12)))){
__zBuffer[_local24] = _local12;
__canvas.setPixel(_local22, _local23, _arg3);
};
};
if ((((_local8 == _local10)) && ((_local9 == _local11)))){
return;
};
_local5 = (2 * _local4);
if (_local5 > -(_local16)){
_local4 = (_local4 - _local16);
_local8 = (_local8 + _local20);
};
if (_local5 < _local15){
_local4 = (_local4 + _local15);
_local9 = (_local9 + _local21);
};
};
}
public function computeScreenPoints(_arg1:Array=null, _arg2:Array=null):void{
var _local3:int;
var _local4:Array;
var _local5:int;
if (_arg1 == null){
_arg1 = Algebra.identity(4);
};
if (_arg2 == null){
_arg2 = Algebra.identity(4);
};
_local4 = Algebra.matrixProduct(_arg1, _arg2);
_local5 = _points.length;
_local3 = 0;
while (_local3 < _local5) {
_projectedPoints[_local3] = Algebra.transformPoint(_globalPoints[_local3], _local4);
_local3++;
};
}
public function set scale(_arg1:Array):void{
_scale = _arg1.concat();
}
public function deletePoint(_arg1:int):void{
var _local2:int;
var _local3:Array;
var _local4:Array;
var _local5:int;
updateModel();
_local3 = _facesPerPoint[_arg1];
_local2 = 0;
while (_local2 < (_local3.length - 1)) {
if (_local3[_local2] > _local3[(_local2 + 1)]){
throw ("FACES NOT ORDERED");
};
_local2++;
};
while (((_local3) && (_local3.length))) {
deleteFace(_local3[(_local3.length - 1)]);
};
delete _points[_arg1];
_points.splice(_arg1, 1);
delete _facesPerPoint[_arg1];
_facesPerPoint.splice(_arg1, 1);
_local5 = _faces.length;
_local2 = 0;
while (_local2 < _local5) {
_local4 = _faces[_local2];
if (_local4[0] > _arg1){
var _local6 = _local4;
var _local7:int;
var _local8 = (_local6[_local7] - 1);
_local6[_local7] = _local8;
};
if (_local4[1] > _arg1){
_local6 = _local4;
_local7 = 1;
_local8 = (_local6[_local7] - 1);
_local6[_local7] = _local8;
};
if (_local4[2] > _arg1){
_local6 = _local4;
_local7 = 2;
_local8 = (_local6[_local7] - 1);
_local6[_local7] = _local8;
};
_local2++;
};
updateModel();
}
public function computeGlobalNormals():void{
var _local1:int;
var _local2:int;
var _local3:int;
_local2 = _faces.length;
_local1 = 0;
while (_local1 < _local2) {
computeFaceNormal(_globalFaceNormals, _local1, _globalPoints);
_local1++;
};
_local3 = _points.length;
_local1 = 0;
while (_local1 < _local3) {
computePointNormal(_globalPointNormals, _local1, _globalFaceNormals);
_local1++;
};
}
private function objIOError(_arg1:IOErrorEvent):void{
var _local2:URLLoader;
_local2 = (_arg1.currentTarget as URLLoader);
_local2.removeEventListener(Event.COMPLETE, objLoaded);
_local2.removeEventListener(IOErrorEvent.IO_ERROR, objIOError);
_local2.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, objSecurityError);
_pendingMaterials = false;
_loaded = true;
_lastObjFileName = "";
dispatchEvent(_arg1);
}
public function deleteFace(_arg1:int):void{
var _local2:Array;
var _local3:Array;
var _local4:int;
var _local5:int;
var _local6:int;
if ((((_arg1 < 0)) || ((_arg1 >= _faces.length)))){
return;
};
_local2 = _faces[_arg1];
_local5 = 0;
while (_local5 < 3) {
_local3 = _facesPerPoint[_local2[_local5]];
_local4 = _local3.length;
_local6 = 0;
while (_local6 < _local4) {
if (_local3[_local6] == _arg1){
_local3.splice(_local6, 1);
break;
};
_local6++;
};
_local5++;
};
delete _faces[_arg1];
_faces.splice(_arg1, 1);
}
public function get faces():Array{
return (_faces);
}
public function setMaterial(_arg1:Material3D):void{
var _local2:String;
var _local3:int;
var _local4:int;
if (!_arg1){
return;
};
_local2 = _arg1.name;
if (!_materials[_local2]){
addMaterial(_arg1);
};
_local3 = _faces.length;
_local4 = 0;
while (_local4 < _local3) {
_faces[_local4].material = _local2;
_local4++;
};
}
public function pointInGroup(_arg1:String, _arg2:int):Boolean{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return (false);
};
if ((((_arg2 < 0)) || ((_arg2 >= _points.length)))){
return (false);
};
_local3 = _pointGroups[_arg2];
if (!_local3){
return (false);
};
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
return (true);
};
_local5++;
};
return (false);
}
public function get pointNormals():Array{
return (_localPointNormals);
}
public function invertNormals():void{
var _local1:int;
var _local2:int;
_local2 = 0;
while (_local2 < _faces.length) {
_local1 = _faces[_local2][0];
_faces[_local2][0] = _faces[_local2][1];
_faces[_local2][1] = _local1;
_local2++;
};
computeGlobalNormals();
}
public function groupExists(_arg1:String):Boolean{
var _local2:int;
var _local3:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return (false);
};
_local2 = _groups.length;
_local3 = 0;
while (_local3 < _local2) {
if (_groups[_local3] == _arg1){
return (true);
};
_local3++;
};
return (false);
}
private function calculatePixel(_arg1:int, _arg2:int, _arg3:int, _arg4:Number, _arg5:Number, _arg6:Number){
var _local7:uint;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:Array;
var _local16:Array;
var _local17:int;
var _local18:Number;
var _local19:Number;
var _local20:int;
var _local21:Array;
var _local22:Array;
var _local23:Number;
var _local24:Number;
var _local25:Number;
var _local26:Number;
var _local27:Number;
var _local28:Number;
var _local29:Number;
var _local30:Number;
var _local31:Number;
var _local32:Number;
var _local33:Number;
var _local34:Number;
var _local35:Number;
var _local36:Number;
var _local37:Number;
var _local38:Number;
var _local39:Number;
var _local40:Number;
var _local41:Number;
var _local42:Number;
var _local43:Number;
var _local44:Number;
var _local45:Number;
if (!__curMaterial.illuminationModel){
_local7 = (((int((__curMaterial.Kd[0] * 0xFF)) << 16) | (int((__curMaterial.Kd[1] * 0xFF)) << 8)) | int((__curMaterial.Kd[2] * 0xFF)));
__canvas.setPixel(_arg2, _arg3, _local7);
return;
};
_local10 = (__scrFaceOrdered[1][0] - _arg4);
_local12 = (__scrFaceOrdered[1][1] - _arg5);
_local11 = (__scrFaceOrdered[2][0] - _arg4);
_local13 = (__scrFaceOrdered[2][1] - _arg5);
_local14 = (0.5 * ((_local10 * _local13) - (_local11 * _local12)));
__prop[0] = (_local14 * __invFaceArea);
_local10 = (__scrFaceOrdered[2][0] - _arg4);
_local12 = (__scrFaceOrdered[2][1] - _arg5);
_local11 = (__scrFaceOrdered[0][0] - _arg4);
_local13 = (__scrFaceOrdered[0][1] - _arg5);
_local14 = (0.5 * ((_local10 * _local13) - (_local11 * _local12)));
__prop[1] = (_local14 * __invFaceArea);
_local10 = (__scrFaceOrdered[0][0] - _arg4);
_local12 = (__scrFaceOrdered[0][1] - _arg5);
_local11 = (__scrFaceOrdered[1][0] - _arg4);
_local13 = (__scrFaceOrdered[1][1] - _arg5);
_local14 = (0.5 * ((_local10 * _local13) - (_local11 * _local12)));
__prop[2] = (_local14 * __invFaceArea);
__point[0] = (((__prop[0] * __points[0][0]) + (__prop[1] * __points[1][0])) + (__prop[2] * __points[2][0]));
__point[1] = (((__prop[0] * __points[0][1]) + (__prop[1] * __points[1][1])) + (__prop[2] * __points[2][1]));
__point[2] = (((__prop[0] * __points[0][2]) + (__prop[1] * __points[1][2])) + (__prop[2] * __points[2][2]));
if (__curFace.smooth){
__normal[0] = (((__prop[0] * __normals[0][0]) + (__prop[1] * __normals[1][0])) + (__prop[2] * __normals[2][0]));
__normal[1] = (((__prop[0] * __normals[0][1]) + (__prop[1] * __normals[1][1])) + (__prop[2] * __normals[2][1]));
__normal[2] = (((__prop[0] * __normals[0][2]) + (__prop[1] * __normals[1][2])) + (__prop[2] * __normals[2][2]));
_local8 = Math.sqrt((((__normal[0] * __normal[0]) + (__normal[1] * __normal[1])) + (__normal[2] * __normal[2])));
_local9 = (1 / _local8);
__normal[0] = (__normal[0] * _local9);
__normal[1] = (__normal[1] * _local9);
__normal[2] = (__normal[2] * _local9);
} else {
__normal[0] = _globalFaceNormals[_arg1][0];
__normal[1] = _globalFaceNormals[_arg1][1];
__normal[2] = _globalFaceNormals[_arg1][2];
};
if (__curMaterial.illuminationModel > 1){
__pointToObserver[0] = (__camPos[0] - __point[0]);
__pointToObserver[1] = (__camPos[1] - __point[1]);
__pointToObserver[2] = (__camPos[2] - __point[2]);
_local8 = Math.sqrt((((__pointToObserver[0] * __pointToObserver[0]) + (__pointToObserver[1] * __pointToObserver[1])) + (__pointToObserver[2] * __pointToObserver[2])));
_local9 = (1 / _local8);
__pointToObserver[0] = (__pointToObserver[0] * _local9);
__pointToObserver[1] = (__pointToObserver[1] * _local9);
__pointToObserver[2] = (__pointToObserver[2] * _local9);
};
__colorSum[0] = 0;
__colorSum[1] = 0;
__colorSum[2] = 0;
if (__curMaterial.illuminationModel > 2){
__blinnSum[0] = 0;
__blinnSum[1] = 0;
__blinnSum[2] = 0;
} else {
__diffuseSum[0] = 0;
__diffuseSum[1] = 0;
__diffuseSum[2] = 0;
__specularSum[0] = 0;
__specularSum[1] = 0;
__specularSum[2] = 0;
};
_local20 = __lig.length;
_local17 = 0;
while (_local17 < _local20) {
_local21 = __lig[_local17].normal;
_local22 = __lig[_local17].color;
if (__lig[_local17].type == Light3D.T_POINT){
__pointToLight[0] = (_local21[0] - __point[0]);
__pointToLight[1] = (_local21[1] - __point[1]);
__pointToLight[2] = (_local21[2] - __point[2]);
_local8 = Math.sqrt((((__pointToLight[0] * __pointToLight[0]) + (__pointToLight[1] * __pointToLight[1])) + (__pointToLight[2] * __pointToLight[2])));
_local9 = (1 / _local8);
__pointToLight[0] = (__pointToLight[0] * _local9);
__pointToLight[1] = (__pointToLight[1] * _local9);
__pointToLight[2] = (__pointToLight[2] * _local9);
} else {
__pointToLight[0] = _local21[0];
__pointToLight[1] = _local21[1];
__pointToLight[2] = _local21[2];
};
_local18 = (((__pointToLight[0] * __normal[0]) + (__pointToLight[1] * __normal[1])) + (__pointToLight[2] * __normal[2]));
if (_local18 < 0){
} else {
if (__curMaterial.illuminationModel > 2){
__blinnLV[0] = (__pointToLight[0] + __pointToObserver[0]);
__blinnLV[1] = (__pointToLight[1] + __pointToObserver[1]);
__blinnLV[2] = (__pointToLight[2] + __pointToObserver[2]);
_local23 = Math.sqrt((((__blinnLV[0] * __blinnLV[0]) + (__blinnLV[1] * __blinnLV[1])) + (__blinnLV[2] * __blinnLV[2])));
_local24 = (1 / _local23);
__blinnH[0] = ((__pointToLight[0] + __pointToObserver[0]) * _local24);
__blinnH[1] = ((__pointToLight[1] + __pointToObserver[1]) * _local24);
__blinnH[2] = ((__pointToLight[2] + __pointToObserver[2]) * _local24);
_local25 = (((__blinnH[0] * __pointToObserver[0]) + (__blinnH[1] * __pointToObserver[1])) + (__blinnH[2] * __pointToObserver[2]));
_local26 = (((__blinnH[0] * __normal[0]) + (__blinnH[1] * __normal[1])) + (__blinnH[2] * __normal[2]));
_local27 = (((__normal[0] * __pointToObserver[0]) + (__normal[1] * __pointToObserver[1])) + (__normal[2] * __pointToObserver[2]));
_local28 = ((2 * _local26) / _local25);
_local29 = Math.min(1, (_local27 * _local28), (_local18 * _local28));
_local30 = Math.acos(_local26);
_local31 = (_local30 * __curMaterial.Ns);
_local32 = (__curMaterial.sharpness * Math.exp((-(_local31) * _local31)));
_local33 = (__curMaterial.Ni - 1);
_local34 = (__curMaterial.Ni + 1);
_local35 = Math.abs((_local33 / _local34));
_local36 = ((1 + _local35) / (1 - _local35));
_local37 = Math.sqrt((((_local36 * _local36) + (_local25 * _local25)) - 1));
_local38 = (_local37 - _local25);
_local39 = (_local37 + _local25);
_local40 = ((_local25 * _local39) - 1);
_local41 = ((_local25 * _local38) + 1);
_local42 = ((0.5 * ((_local38 * _local38) / (_local39 * _local39))) * (1 + ((_local40 * _local40) / (_local41 * _local41))));
_local43 = (Math.PI * _local27);
_local44 = (((_local32 * _local42) * _local29) / _local43);
__blinnRS[0] = ((_local44 * __curMaterial.Ks[0]) + __curMaterial.Kd[0]);
__blinnRS[1] = ((_local44 * __curMaterial.Ks[1]) + __curMaterial.Kd[1]);
__blinnRS[2] = ((_local44 * __curMaterial.Ks[2]) + __curMaterial.Kd[2]);
__blinnSum[0] = (__blinnSum[0] + ((_local22[0] * _local18) * __blinnRS[0]));
__blinnSum[1] = (__blinnSum[1] + ((_local22[1] * _local18) * __blinnRS[1]));
__blinnSum[2] = (__blinnSum[2] + ((_local22[2] * _local18) * __blinnRS[2]));
} else {
__diffuseSum[0] = (__diffuseSum[0] + ((_local18 * __curMaterial.Kd[0]) * _local22[0]));
__diffuseSum[1] = (__diffuseSum[1] + ((_local18 * __curMaterial.Kd[1]) * _local22[1]));
__diffuseSum[2] = (__diffuseSum[2] + ((_local18 * __curMaterial.Kd[2]) * _local22[2]));
if (__curMaterial.illuminationModel > 1){
_local45 = (2 * _local18);
__pointToReflect[0] = ((_local45 * __normal[0]) - __pointToLight[0]);
__pointToReflect[1] = ((_local45 * __normal[1]) - __pointToLight[1]);
__pointToReflect[2] = ((_local45 * __normal[2]) - __pointToLight[2]);
_local8 = Math.sqrt((((__pointToReflect[0] * __pointToReflect[0]) + (__pointToReflect[1] * __pointToReflect[1])) + (__pointToReflect[2] * __pointToReflect[2])));
_local9 = (1 / _local8);
__pointToReflect[0] = (__pointToReflect[0] * _local9);
__pointToReflect[1] = (__pointToReflect[1] * _local9);
__pointToReflect[2] = (__pointToReflect[2] * _local9);
_local19 = (((__pointToReflect[0] * __pointToObserver[0]) + (__pointToReflect[1] * __pointToObserver[1])) + (__pointToReflect[2] * __pointToObserver[2]));
if (_local19 >= 0){
if (_local19 > 1){
_local19 = 1;
};
_local19 = Math.pow(_local19, __curMaterial.Ns);
__specularSum[0] = (__specularSum[0] + ((_local22[0] * _local19) * __curMaterial.Ks[0]));
__specularSum[1] = (__specularSum[1] + ((_local22[1] * _local19) * __curMaterial.Ks[1]));
__specularSum[2] = (__specularSum[2] + ((_local22[2] * _local19) * __curMaterial.Ks[2]));
};
};
};
};
_local17++;
};
if (__curMaterial.illuminationModel > 2){
__colorSum[0] = ((__curMaterial.emissive[0] + (__amb[0] * __curMaterial.Ka[0])) + __blinnSum[0]);
__colorSum[1] = ((__curMaterial.emissive[1] + (__amb[1] * __curMaterial.Ka[1])) + __blinnSum[1]);
__colorSum[2] = ((__curMaterial.emissive[2] + (__amb[2] * __curMaterial.Ka[2])) + __blinnSum[2]);
} else {
__specularSum[0] = ((__specularSum[0])>1) ? 1 : __specularSum[0];
__specularSum[1] = ((__specularSum[1])>1) ? 1 : __specularSum[1];
__specularSum[2] = ((__specularSum[2])>1) ? 1 : __specularSum[2];
__diffuseSum[0] = ((__diffuseSum[0])>1) ? 1 : __diffuseSum[0];
__diffuseSum[1] = ((__diffuseSum[1])>1) ? 1 : __diffuseSum[1];
__diffuseSum[2] = ((__diffuseSum[2])>1) ? 1 : __diffuseSum[2];
__colorSum[0] = (((__curMaterial.emissive[0] + (__amb[0] * __curMaterial.Ka[0])) + __diffuseSum[0]) + __specularSum[0]);
__colorSum[1] = (((__curMaterial.emissive[1] + (__amb[1] * __curMaterial.Ka[1])) + __diffuseSum[1]) + __specularSum[1]);
__colorSum[2] = (((__curMaterial.emissive[2] + (__amb[2] * __curMaterial.Ka[2])) + __diffuseSum[2]) + __specularSum[2]);
};
__colorSum[0] = ((__colorSum[0])>1) ? 1 : __colorSum[0];
__colorSum[1] = ((__colorSum[1])>1) ? 1 : __colorSum[1];
__colorSum[2] = ((__colorSum[2])>1) ? 1 : __colorSum[2];
_local7 = ((((__colorSum[0] * 0xFF) << 16) | ((__colorSum[1] * 0xFF) << 8)) | (__colorSum[2] * 0xFF));
__canvas.setPixel(_arg2, _arg3, _local7);
}
public function get matrix():Array{
return (_matrix);
}
public function getFacesFromGroup(_arg1:String):Array{
var _local2:int;
var _local3:int;
var _local4:Array;
if (((!(_arg1)) || (!(_arg1.length)))){
return ([]);
};
_local3 = _faces.length;
_local4 = [];
_local2 = 0;
while (_local2 < _local3) {
if (faceInGroup(_arg1, _local2)){
_local4.push(_local2);
};
_local2++;
};
return (_local4);
}
private function drawFace(_arg1:int):void{
var _local2:Number;
var _local3:Number;
var _local4:Number;
var _local5:Number;
var _local6:Array;
var _local7:Number;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:int;
var _local14:int;
var _local15:int;
var _local16:int;
var _local17:int;
var _local18:int;
var _local19:int;
var _local20:int;
var _local21:Number;
var _local22:Number;
var _local23:Number;
var _local24:Number;
var _local25:Number;
var _local26:Number;
var _local27:int;
var _local28:int;
var _local29:int;
var _local30:int;
var _local31:int;
var _local32:Number;
var _local33:Number;
var _local34:Number;
var _local35:Number;
var _local36:Number;
var _local37:Number;
var _local38:Number;
var _local39:Number;
var _local40:Number;
var _local41:Number;
var _local42:Number;
var _local43:int;
var _local44:int;
var _local45:Number;
var _local46:int;
var _local47:Number;
var _local48:Number;
var _local49:Number;
__curFace = _faces[_arg1];
if (!__curFace.visible){
return;
};
__curMaterial = _materials[__curFace.material];
if (!__curMaterial){
__curMaterial = _materials[""];
};
__scrFaceOrdered[0] = (__curScrFace[0] = _projectedPoints[__curFace[0]]);
__scrFaceOrdered[1] = (__curScrFace[1] = _projectedPoints[__curFace[1]]);
__scrFaceOrdered[2] = (__curScrFace[2] = _projectedPoints[__curFace[2]]);
__points[0] = _globalPoints[__curFace[0]];
__points[1] = _globalPoints[__curFace[1]];
__points[2] = _globalPoints[__curFace[2]];
__normals[0] = _globalPointNormals[__curFace[0]];
__normals[1] = _globalPointNormals[__curFace[1]];
__normals[2] = _globalPointNormals[__curFace[2]];
_local2 = (__scrFaceOrdered[1][0] - __scrFaceOrdered[0][0]);
_local4 = (__scrFaceOrdered[1][1] - __scrFaceOrdered[0][1]);
_local3 = (__scrFaceOrdered[2][0] - __scrFaceOrdered[0][0]);
_local5 = (__scrFaceOrdered[2][1] - __scrFaceOrdered[0][1]);
__faceArea = (0.5 * ((_local2 * _local5) - (_local3 * _local4)));
__invFaceArea = (1 / __faceArea);
if (__curScrFace[2][1] > __curScrFace[0][1]){
_local6 = __curScrFace[0];
__curScrFace[0] = __curScrFace[2];
__curScrFace[2] = _local6;
};
if (__curScrFace[1][1] > __curScrFace[0][1]){
_local6 = __curScrFace[1];
__curScrFace[1] = __curScrFace[0];
__curScrFace[0] = _local6;
};
if (__curScrFace[2][1] > __curScrFace[1][1]){
_local6 = __curScrFace[2];
__curScrFace[2] = __curScrFace[1];
__curScrFace[1] = _local6;
};
_local7 = (Math.max(__curScrFace[0][0], __curScrFace[1][0], __curScrFace[2][0]) + __scrW2);
_local8 = (Math.min(__curScrFace[0][0], __curScrFace[1][0], __curScrFace[2][0]) + __scrW2);
_local9 = (__scrH2 - __curScrFace[2][1]);
_local10 = (__scrH2 - __curScrFace[0][1]);
_local11 = Math.max(__curScrFace[0][2], __curScrFace[1][2], __curScrFace[2][2]);
_local12 = Math.min(__curScrFace[0][2], __curScrFace[1][2], __curScrFace[2][2]);
if (_local10 >= __scrH){
return;
};
if (_local9 < 0){
return;
};
if ((((_local9 >= __scrH)) && ((_local10 < 0)))){
return;
};
if (_local8 >= __scrW){
return;
};
if (_local7 < 0){
return;
};
if ((((_local7 >= __scrW)) && ((_local8 < 0)))){
return;
};
if ((((_local12 > 1)) || ((_local11 < -1)))){
return;
};
_local18 = __curScrFace[0][0];
_local19 = __curScrFace[1][0];
_local20 = __curScrFace[2][0];
_local14 = __curScrFace[0][1];
_local15 = __curScrFace[1][1];
_local16 = __curScrFace[2][1];
_local21 = __curScrFace[0][2];
_local22 = __curScrFace[1][2];
_local23 = __curScrFace[2][2];
_local29 = (_local15 - _local14);
_local30 = (_local16 - _local14);
_local31 = (_local16 - _local15);
_local32 = ((_local19 - _local18) / _local29);
_local33 = ((_local20 - _local18) / _local30);
_local34 = ((_local20 - _local19) / _local31);
_local35 = ((_local22 - _local21) / _local29);
_local36 = ((_local23 - _local21) / _local30);
_local37 = ((_local23 - _local22) / _local31);
_local39 = _local18;
_local38 = _local39;
_local41 = _local21;
_local40 = _local41;
if (_local14 == _local16){
if (_local38 > _local20){
_local38 = _local20;
_local40 = _local23;
};
if (_local38 > _local19){
_local38 = _local19;
_local40 = _local22;
};
if (_local39 < _local18){
_local39 = _local21;
_local41 = _local21;
};
if (_local39 < _local19){
_local39 = _local19;
_local41 = _local22;
};
};
_local13 = _local14;
while (_local13 >= _local16) {
_local44 = (__scrH2 - _local13);
if (_local44 >= __scrH){
break;
};
if (_local13 == _local16){
_local39 = _local20;
_local41 = _local23;
};
if (_local38 > _local39){
_local27 = _local39;
_local28 = _local38;
_local25 = _local41;
_local26 = _local40;
_local45 = (_local28 - _local27);
} else {
_local27 = _local38;
_local28 = _local39;
_local25 = _local40;
_local26 = _local41;
_local45 = (_local28 - _local27);
};
_local42 = ((_local26 - _local25) / _local45);
_local17 = _local27;
_local24 = _local25;
while ((((_local17 <= _local28)) && ((_local44 >= 0)))) {
_local43 = (__scrW2 + _local17);
if (_local43 >= __scrW){
break;
};
if (_local43 < 0){
} else {
if ((((((((_local42 > 0)) && ((_local24 > _local26)))) || ((((_local42 <= 0)) && ((_local24 < _local26)))))) || (isNaN(_local24)))){
_local24 = _local26;
};
_local46 = ((_local43 * __scrH) + _local44);
if ((((_local24 < -1)) || ((_local24 > 1)))){
} else {
if (_local24 >= __zBuffer[_local46]){
} else {
__zBuffer[_local46] = _local24;
calculatePixel(_arg1, _local43, _local44, _local17, _local13, _local24);
};
};
};
_local17++;
_local24 = (_local24 + _local42);
};
_local39 = (_local39 - _local33);
_local41 = (_local41 - _local36);
if (_local13 > _local15){
_local38 = (_local38 - _local32);
_local40 = (_local40 - _local35);
} else {
if (_local13 == _local15){
_local38 = (_local19 - _local34);
_local40 = (_local22 - _local37);
} else {
_local38 = (_local38 - _local34);
_local40 = (_local40 - _local37);
};
};
_local13--;
};
}
public function removeMaterial(_arg1:Material3D){
if (!_arg1){
return;
};
removeMaterialByName(_arg1.name);
}
public function get groups():Array{
return (_groups.concat());
}
private function objLoaded(_arg1:Event):void{
var _local2:URLLoader;
_loaded = true;
_local2 = (_arg1.currentTarget as URLLoader);
_local2.removeEventListener(Event.COMPLETE, objLoaded);
_local2.removeEventListener(IOErrorEvent.IO_ERROR, objIOError);
_local2.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, objSecurityError);
Model3DEditor.readOBJ(_local2.data, this);
if (!_pendingMaterials){
_lastObjFileName = "";
};
dispatchEvent(new Event("complete"));
}
public function loadMTL(_arg1:String){
var _local2:URLLoader;
var _local3:String;
_loaded = false;
_pendingMaterials = true;
_local3 = "";
if (((_lastObjFileName) && (_lastObjFileName.length))){
_local3 = _lastObjFileName.slice(0, (_lastObjFileName.lastIndexOf("/") + 1));
};
_local2 = new URLLoader();
_local2.addEventListener(Event.COMPLETE, mtlLoaded);
_local2.addEventListener(IOErrorEvent.IO_ERROR, objIOError);
_local2.addEventListener(SecurityErrorEvent.SECURITY_ERROR, objSecurityError);
_local2.load(new URLRequest((_local3 + _arg1)));
}
public function get points():Array{
return (_points);
}
public function updateModel():void{
var _local1:int;
var _local2:int;
var _local3:int;
_local2 = _points.length;
_local3 = _faces.length;
_local1 = 0;
while (_local1 < _local2) {
if (!_pointGroups[_local1]){
_pointGroups[_local1] = [];
};
_facesPerPoint[_local1] = [];
_local1++;
};
_local1 = 0;
while (_local1 < _local3) {
if (!_faces[_local1]){
faces.splice(_local1, 1);
_local3--;
_local1--;
} else {
if (!_faceGroups[_local1]){
_faceGroups[_local1] = [];
};
Model3DEditor.initializeFace(_faces[_local1]);
_facesPerPoint[_faces[_local1][0]].push(_local1);
_facesPerPoint[_faces[_local1][1]].push(_local1);
_facesPerPoint[_faces[_local1][2]].push(_local1);
};
_local1++;
};
computeLocalNormals();
}
public function addMaterial(_arg1:Material3D):void{
var _local2:String;
_local2 = _arg1.name;
if (!_materials[_local2]){
_materialNames.push(_local2);
};
_materials[_local2] = _arg1;
}
public function removePointFromGroup(_arg1:String, _arg2:int):void{
var _local3:Array;
var _local4:int;
var _local5:int;
if (((!(_arg1)) || (!(_arg1.length)))){
return;
};
if ((((_arg2 < 0)) || ((_arg2 >= _points.length)))){
return;
};
_local3 = _pointGroups[_arg2];
_local4 = _local3.length;
_local5 = 0;
while (_local5 < _local4) {
if (_local3[_local5] == _arg1){
_local3.splice(_local5, 1);
return;
};
_local5++;
};
}
public function updateMatrix():void{
_matrix = Algebra.matrixProduct(Algebra.identity(4), Algebra.scale(_scale[0], _scale[1], _scale[2]));
_matrix = Algebra.matrixProduct(_matrix, Algebra.rotateY(_rotation[1]));
_matrix = Algebra.matrixProduct(_matrix, Algebra.rotateX(_rotation[0]));
_matrix = Algebra.matrixProduct(_matrix, Algebra.rotateZ(_rotation[2]));
_matrix = Algebra.matrixProduct(_matrix, Algebra.translate(_position[0], _position[1], _position[2]));
computeGlobalPoints();
}
private function objSecurityError(_arg1:SecurityErrorEvent):void{
var _local2:URLLoader;
_local2 = (_arg1.currentTarget as URLLoader);
_local2.removeEventListener(Event.COMPLETE, objLoaded);
_local2.removeEventListener(IOErrorEvent.IO_ERROR, objIOError);
_local2.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, objSecurityError);
_pendingMaterials = false;
_loaded = true;
_lastObjFileName = "";
dispatchEvent(_arg1);
}
public function setSmooth(_arg1:Boolean=true):void{
var _local2:int;
var _local3:int;
_local2 = _faces.length;
_local3 = 0;
while (_local3 < _local2) {
_faces[_local3].smooth = _arg1;
_local3++;
};
}
private function computePointNormal(_arg1:Array, _arg2:int, _arg3:Array):void{
var _local4:int;
var _local5:Number;
var _local6:Array;
var _local7:int;
var _local8:Array;
_local6 = [0, 0, 0];
_local7 = _facesPerPoint[_arg2].length;
_local4 = 0;
while (_local4 < _local7) {
_local8 = _arg3[_facesPerPoint[_arg2][_local4]];
if (!_local8){
_local8 = (_arg3[_arg3[_facesPerPoint[_arg2][_local4]]] = []);
};
_local6[0] = (_local6[0] + _local8[0]);
_local6[1] = (_local6[1] + _local8[1]);
_local6[2] = (_local6[2] + _local8[2]);
_local4++;
};
Algebra.normalize(_local6);
_arg1[_arg2] = _local6;
}
}
}//package pixels3d
Section 7
//Model3DEditor (pixels3d.Model3DEditor)
package pixels3d {
public final class Model3DEditor {
public function getEdges(_arg1:Array):Array{
var _local2:int;
var _local3:Array;
var _local4:Array;
var _local5:Array;
var _local6:Array;
var _local7:int;
var _local8:int;
var _local9:int;
_local2 = _arg1.length;
_local3 = [];
_local8 = 0;
while (_local8 < _local2) {
_local4 = _arg1[_local8];
_local5 = [];
_local5[0] = ((_local4[0])<_local4[1]) ? [_local4[0], _local4[1]] : [_local4[1], _local4[0]];
_local5[1] = ((_local4[1])<_local4[2]) ? [_local4[1], _local4[2]] : [_local4[2], _local4[1]];
_local5[2] = ((_local4[2])<_local4[0]) ? [_local4[2], _local4[0]] : [_local4[0], _local4[2]];
_local6 = [false, false, false];
_local7 = _local3.length;
_local9 = 0;
while (_local9 < _local7) {
_local6[0] = ((_local6[0]) || ((((_local3[_local9][0] == _local5[0][0])) && ((_local3[_local9][1] == _local5[0][1])))));
_local6[1] = ((_local6[1]) || ((((_local3[_local9][0] == _local5[1][0])) && ((_local3[_local9][1] == _local5[1][1])))));
_local6[2] = ((_local6[2]) || ((((_local3[_local9][0] == _local5[2][0])) && ((_local3[_local9][1] == _local5[2][1])))));
_local9++;
};
if (!_local6[0]){
_local3[_local3.length] = _local5[0];
};
if (!_local6[1]){
_local3[_local3.length] = _local5[1];
};
if (!_local6[2]){
_local3[_local3.length] = _local5[2];
};
_local8++;
};
return (_local3);
}
public static function getFaces(_arg1:Array, _arg2:Model3D):Array{
var _local3:int;
var _local4:Array;
var _local5:int;
_local3 = _arg1.length;
_local4 = [];
_local5 = 0;
while (_local5 < _local3) {
_local4[_local4.length] = _arg2.faces[_arg1[_local5]];
_local5++;
};
return (_local4);
}
public static function readOBJ(_arg1:String, _arg2:Model3D):void{
var _local3:int;
var _local4:int;
var _local5:String;
var _local6:int;
var _local7:Array;
var _local8:Array;
var _local9:Array;
_local3 = 0;
_local4 = _arg1.length;
_local7 = [false];
_local8 = [null];
_local9 = [];
_arg2.clear();
_arg2.updateModel();
while (_local3 < _local4) {
_local6 = _arg1.indexOf("\n", _local3);
if (_local6 == -1){
_local6 = _local4;
};
_local5 = _arg1.slice(_local3, _local6);
readOBJLine(_local5, _arg2, _local8, _local7, _local9);
_local3 = _local4;
_local3 = (_local6 + 1);
};
_arg2.updateModel();
_arg2.updateMatrix();
}
private static function readMTLLine(_arg1:String, _arg2:Array){
var _local3:String;
var _local4:int;
var _local5:int;
var _local6:int;
var _local7:Array;
var _local8:Array;
var _local9:Array;
var _local10:Array;
var _local11:int;
var _local12:Material3D;
_arg1 = removeWhiteSpace(_arg1);
_local7 = _arg1.split(" ");
_local11 = (_arg2.length - 1);
_local12 = null;
if (_local11 > -1){
_local12 = _arg2[_local11];
};
switch (_local7[0]){
case "newmtl":
if (!_local7[1]){
_arg2[_arg2.length] = new Material3D("");
} else {
_arg2[_arg2.length] = new Material3D(_local7[1]);
};
break;
case "Ka":
_local12.Ka = [Number(_local7[1]), Number(_local7[2]), Number(_local7[3])];
break;
case "Kd":
_local12.Kd = [Number(_local7[1]), Number(_local7[2]), Number(_local7[3])];
break;
case "Ks":
_local12.Ks = [Number(_local7[1]), Number(_local7[2]), Number(_local7[3])];
break;
case "Ns":
_local12.Ns = Number(_local7[1]);
break;
case "Ni":
_local12.Ni = Number(_local7[1]);
break;
case "sharpness":
_local12.sharpness = Number(_local7[1]);
break;
case "illum":
_local12.illuminationModel = int(_local7[1]);
break;
};
}
public static function getGlobalAverage(_arg1:Model3D):Array{
var _local2:Array;
var _local3:Array;
var _local4:int;
_arg1.updateModel();
_arg1.updateMatrix();
_local2 = [0, 0, 0];
_local3 = _arg1.globalPoints;
_local4 = 0;
while (_local4 < _local3.length) {
_local2[0] = (_local2[0] + _local3[_local4][0]);
_local2[1] = (_local2[1] + _local3[_local4][1]);
_local2[2] = (_local2[2] + _local3[_local4][2]);
_local4++;
};
if (_local3.length){
_local2[0] = (_local2[0] / _local3.length);
_local2[1] = (_local2[1] / _local3.length);
_local2[2] = (_local2[2] / _local3.length);
};
return (_local2);
}
public static function createRotational(_arg1:Array, _arg2:int, _arg3:Boolean=true, _arg4:Boolean=false){
var _local5:int;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:Model3D;
var _local10:Number;
var _local11:Number;
var _local12:int;
var _local13:int;
var _local14:int;
var _local15:int;
var _local16:int;
var _local17:Number;
var _local18:int;
var _local19:int;
var _local20:Number;
var _local21:Number;
var _local22:Number;
var _local23:int;
var _local24:int;
_local9 = new Model3D();
_local17 = ((Math.PI * 2) / _arg2);
_local18 = _arg1.length;
_local19 = (_local18 * _arg2);
_local20 = -(Infinity);
_local21 = Infinity;
_local7 = 0;
_local8 = 0;
_local5 = 0;
while (_local5 < _arg2) {
_local10 = Math.cos((_local17 * _local5));
_local11 = Math.sin((_local17 * _local5));
_local6 = 0;
while (_local6 < _local18) {
_local20 = Math.max(_local20, _arg1[_local6][1]);
_local21 = Math.min(_local21, _arg1[_local6][1]);
_local16 = ((_local5 * _local18) + _local6);
_local9.points[_local16] = [(_local10 * _arg1[_local6][0]), _arg1[_local6][1], (_local11 * _arg1[_local6][0]), 1];
if ((((_local6 < (_local18 - 1))) || (_arg4))){
_local12 = ((_local5 * _local18) + _local6);
_local13 = ((_local5 * _local18) + ((_local6 + 1) % _local18));
_local14 = ((((_local5 * _local18) + _local18) % _local19) + _local6);
_local15 = ((((_local5 * _local18) + _local18) % _local19) + ((_local6 + 1) % _local18));
var _temp1 = _local8;
_local8 = (_local8 + 1);
var _local25 = _temp1;
_local9.faces[_local25] = [_local15, _local13, _local12];
var _temp2 = _local8;
_local8 = (_local8 + 1);
var _local26 = _temp2;
_local9.faces[_local26] = [_local15, _local12, _local14];
};
_local6++;
};
_local5++;
};
_local22 = ((_local20 + _local21) * 0.5);
_local23 = _local19;
_local24 = (_local19 + 1);
if (((_arg3) && (!(_arg4)))){
_local9.points[_local23] = [0, _arg1[0][1], 0, 1];
_local5 = 0;
while (_local5 < _arg2) {
var _temp3 = _local8;
_local8 = (_local8 + 1);
_local25 = _temp3;
_local9.faces[_local25] = [(((_local5 * _local18) + _local18) % _local19), ((_local5 * _local18) % _local19), _local23];
_local5++;
};
_local9.points[_local24] = [0, _arg1[(_arg1.length - 1)][1], 0, 1];
_local5 = 0;
while (_local5 < _arg2) {
var _temp4 = _local8;
_local8 = (_local8 + 1);
_local25 = _temp4;
_local9.faces[_local25] = [((((_local5 * _local18) + _local18) - 1) % _local19), (((((_local5 * _local18) + _local18) + _local18) - 1) % _local19), _local24];
_local5++;
};
};
_local5 = 0;
while (_local5 < _local9.points.length) {
_local9.points[_local5][1] = (_local9.points[_local5][1] - _local22);
_local5++;
};
_local9.updateModel();
_local9.updateMatrix();
return (_local9);
}
public static function writeMTL(_arg1:Model3D):String{
var _local2:int;
var _local3:Array;
var _local4:Array;
var _local5:int;
var _local6:Material3D;
var _local7:String;
_local3 = _arg1.materialNames;
_local4 = _arg1.materials;
_local5 = _local3.length;
_local7 = "";
_local2 = 0;
while (_local2 < _local5) {
_local6 = _local4[_local3[_local2]];
_local7 = (_local7 + (("newmtl " + _local6.name) + "\n"));
_local7 = (_local7 + (((((("Ka " + _local6.Ka[0].toFixed(4)) + " ") + _local6.Ka[1].toFixed(4)) + " ") + _local6.Ka[2].toFixed(4)) + "\n"));
_local7 = (_local7 + (((((("Kd " + _local6.Kd[0].toFixed(4)) + " ") + _local6.Kd[1].toFixed(4)) + " ") + _local6.Kd[2].toFixed(4)) + "\n"));
_local7 = (_local7 + (((((("Ks " + _local6.Ks[0].toFixed(4)) + " ") + _local6.Ks[1].toFixed(4)) + " ") + _local6.Ks[2].toFixed(4)) + "\n"));
_local7 = (_local7 + (("Ns " + _local6.Ns) + "\n"));
_local7 = (_local7 + (("sharpness " + _local6.sharpness) + "\n"));
_local7 = (_local7 + (("Ni " + _local6.Ni) + "\n"));
_local7 = (_local7 + "d 1.000\n");
_local7 = (_local7 + (("illum " + _local6.illuminationModel) + "\n"));
_local7 = (_local7 + "\n\n");
_local2++;
};
return (_local7);
}
public static function splitPointsByOuter(_arg1:Array, _arg2:Array, _arg3:Array):void{
var _local4:Array;
var _local5:Array;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:Array;
var _local11:Array;
var _local12:int;
var _local13:Boolean;
_local4 = getPoints(_arg1);
_local5 = getOuterEdges(_arg1);
_arg2.length = (_arg3.length = 0);
_local8 = _local5.length;
_local9 = 0;
_local11 = [false, false];
_local6 = 0;
while (_local6 < _local8) {
_local10 = _local5[_local6];
_local11[0] = false;
_local11[1] = false;
_local9 = _arg2.length;
_local7 = 0;
while (_local7 < _local9) {
if (_arg2[_local7] == _local10[0]){
_local11[0] = true;
};
if (_arg2[_local7] == _local10[1]){
_local11[1] = true;
};
_local7++;
};
if (!_local11[0]){
_arg2[_arg2.length] = _local10[0];
};
if (!_local11[1]){
_arg2[_arg2.length] = _local10[1];
};
_local6++;
};
_local12 = _local4.length;
_local9 = _arg2.length;
_local6 = 0;
while (_local6 < _local12) {
_local13 = false;
_local7 = 0;
while (_local7 < _local9) {
if (_local4[_local6] == _arg2[_local7]){
_local13 = true;
break;
};
_local7++;
};
if (!_local13){
_arg3[_arg3.length] = _local4[_local6];
};
_local6++;
};
}
public static function removeWhiteSpace(_arg1:String):String{
var _local2:String;
var _local3:int;
var _local4:Boolean;
_local2 = _arg1;
_local3 = 0;
while (isWhiteSpace(_local2.charAt(0))) {
_local2 = _local2.slice(1, _local2.length);
};
_local4 = false;
while (_local3 < _local2.length) {
_local4 = false;
while ((((_local3 < _local2.length)) && (!(isWhiteSpace(_local2.charAt(_local3)))))) {
_local3++;
};
while ((((_local3 < _local2.length)) && (isWhiteSpace(_local2.charAt(_local3))))) {
_local4 = true;
_local2 = (_local2.slice(0, _local3) + _local2.slice((_local3 + 1), _local2.length));
};
if (((_local4) && ((_local3 < _local2.length)))){
_local2 = ((_local2.slice(0, _local3) + " ") + _local2.slice(_local3, _local2.length));
};
_local3++;
};
return (_local2);
}
public static function createMesh(_arg1:int, _arg2:int, _arg3:Number, _arg4:Number):Model3D{
var _local5:Model3D;
var _local6:Number;
var _local7:Number;
var _local8:Number;
var _local9:Number;
var _local10:int;
var _local11:int;
var _local12:Number;
var _local13:Number;
var _local14:int;
var _local15:int;
var _local16:int;
var _local17:int;
var _local18:int;
var _local19:int;
_local5 = new Model3D();
_local6 = (-(_arg3) * 0.5);
_local7 = (_arg4 * 0.5);
_local8 = (_arg3 / _arg1);
_local9 = (-(_arg4) / _arg2);
_local14 = 0;
_local15 = 0;
_local10 = 0;
while (_local10 <= _arg1) {
_local12 = (_local6 + (_local8 * _local10));
_local11 = 0;
while (_local11 <= _arg2) {
_local13 = (_local7 + (_local9 * _local11));
var _temp1 = _local14;
_local14 = (_local14 + 1);
var _local20 = _temp1;
_local5.points[_local20] = [_local12, 0, _local13, 1];
if ((((_local10 > 0)) && ((_local11 > 0)))){
_local19 = ((_local10 * (_arg2 + 1)) + _local11);
_local17 = (((_local10 * (_arg2 + 1)) + _local11) - 1);
_local18 = (((_local10 - 1) * (_arg2 + 1)) + _local11);
_local16 = ((((_local10 - 1) * (_arg2 + 1)) + _local11) - 1);
var _temp2 = _local15;
_local15 = (_local15 + 1);
var _local21 = _temp2;
_local5.faces[_local21] = [_local19, _local18, _local17];
var _temp3 = _local15;
_local15 = (_local15 + 1);
var _local22 = _temp3;
_local5.faces[_local22] = [_local18, _local16, _local17];
};
_local11++;
};
_local10++;
};
_local5.updateModel();
_local5.updateMatrix();
return (_local5);
}
public static function getFacesByLine(_arg1:Array, _arg2:int, _arg3:int):Array{
var _local4:int;
var _local5:int;
var _local6:Array;
var _local7:Array;
var _local8:int;
_local5 = _arg1.length;
_local7 = [];
_local4 = 0;
while (_local4 < _local5) {
_local8 = 0;
_local6 = _arg1[_local4];
if (_local6[0] == _arg2){
_local8++;
};
if (_local6[1] == _arg2){
_local8++;
};
if (_local6[2] == _arg2){
_local8++;
};
if (_local6[0] == _arg3){
_local8++;
};
if (_local6[1] == _arg3){
_local8++;
};
if (_local6[2] == _arg3){
_local8++;
};
if (_local8 == 2){
_local7[_local7.length] = _local4;
};
_local4++;
};
return (_local7);
}
public static function splitLines(_arg1:Model3D, _arg2:Array){
var _local3:Array;
var _local4:int;
var _local5:int;
var _local6:Array;
var _local7:Array;
_local3 = getSharedLines(_arg1, _arg2);
_local5 = _local3.length;
_local4 = 0;
while (_local4 < _local5) {
_local6 = _local3[_local4];
_local7 = getFacesByLine(_arg1.faces, _local6[0], _local6[1]);
splitLine(_arg1, _local7[0], _local7[1]);
_local4++;
};
}
public static function initializeFace(_arg1:Array):void{
if (!_arg1.material){
_arg1.material = "";
};
if (!_arg1.smooth){
_arg1.smooth = false;
};
if ((((_arg1.visible == undefined)) || ((_arg1.visible == null)))){
_arg1.visible = true;
};
}
public static function combineModels(_arg1:Model3D, _arg2:Model3D):Model3D{
var _local3:int;
var _local4:int;
var _local5:Model3D;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:int;
var _local11:int;
var _local12:int;
var _local13:int;
var _local14:Array;
var _local15:int;
var _local16:Array;
var _local17:int;
_local5 = new Model3D();
_local6 = _arg1.points.length;
_local7 = _arg1.faces.length;
_local8 = _arg1.materialNames.length;
_local9 = _arg1.groups.length;
_local10 = _arg2.points.length;
_local11 = _arg2.faces.length;
_local12 = _arg2.materialNames.length;
_local13 = _arg2.groups.length;
_arg1.updateMatrix();
_arg2.updateMatrix();
_local5.visible = _arg1.visible;
_local5.wireframe = _arg1.wireframe;
_local5.cull = _arg1.cull;
_arg1.materials[""] = _local5.materials[""].clone();
_local3 = 0;
while (_local3 < _local9) {
_local5.addGroup(_arg1.groups[_local3]);
_local3++;
};
_local3 = 0;
while (_local3 < _local8) {
_local5.addMaterial(_arg1.materials[_arg1.materialNames[_local3]]);
_local3++;
};
_local3 = 0;
while (_local3 < _local6) {
_local5.points[_local3] = Algebra.transformPoint(_arg1.points[_local3], _arg1.matrix);
_local14 = _arg1.getGroupsFromPoint(_local3);
_local15 = _local14.length;
_local4 = 0;
while (_local4 < _local15) {
_local5.addPointToGroup(_local14[_local4], _local3);
_local4++;
};
_local3++;
};
_local3 = 0;
while (_local3 < _local7) {
_local5.faces[_local3] = copyFace(_arg1.faces[_local3]);
_local16 = _arg1.getGroupsFromFace(_local3);
_local17 = _local16.length;
_local4 = 0;
while (_local4 < _local15) {
_local5.addFaceToGroup(_local16[_local4], _local3);
_local4++;
};
_local3++;
};
_local3 = 0;
while (_local3 < _local13) {
_local5.addGroup(_arg2.groups[_local3]);
_local3++;
};
_local3 = 0;
while (_local3 < _local12) {
if (_arg1.materials[_arg2.materialNames[_local3]] != null){
} else {
_local5.addMaterial(_arg2.materials[_arg2.materialNames[_local3]]);
};
_local3++;
};
_local3 = 0;
while (_local3 < _local10) {
_local5.points[(_local6 + _local3)] = Algebra.transformPoint(_arg2.points[_local3], _arg2.matrix);
_local14 = _arg2.getGroupsFromPoint(_local3);
_local15 = _local14.length;
_local4 = 0;
while (_local4 < _local15) {
_local5.addPointToGroup(_local14[_local4], (_local6 + _local3));
_local4++;
};
_local3++;
};
_local3 = 0;
while (_local3 < _local11) {
_local5.faces[(_local7 + _local3)] = copyFace(_arg2.faces[_local3]);
_local5.faces[(_local7 + _local3)][0] = (_local5.faces[(_local7 + _local3)][0] + _local6);
_local5.faces[(_local7 + _local3)][1] = (_local5.faces[(_local7 + _local3)][1] + _local6);
_local5.faces[(_local7 + _local3)][2] = (_local5.faces[(_local7 + _local3)][2] + _local6);
_local16 = _arg2.getGroupsFromFace(_local3);
_local17 = _local16.length;
_local4 = 0;
while (_local4 < _local15) {
_local5.addFaceToGroup(_local16[_local4], (_local3 + _local7));
_local4++;
};
_local3++;
};
_local5.updateModel();
_local5.updateMatrix();
return (_local5);
}
public static function extrudeFaces(_arg1:Model3D, _arg2:Array, _arg3:Number){
var _local4:int;
var _local5:int;
var _local6:int;
var _local7:int;
var _local8:Array;
var _local9:Array;
var _local10:Array;
var _local11:int;
var _local12:Array;
var _local13:int;
var _local14:Array;
var _local15:Array;
var _local16:Array;
var _local17:int;
var _local18:int;
var _local19:int;
var _local20:int;
var _local21:int;
var _local22:int;
var _local23:int;
var _local24:int;
var _local25:Array;
var _local26:Array;
var _local27:Array;
var _local28:int;
var _local29:int;
var _local30:int;
var _local31:Boolean;
var _local32:Boolean;
var _local33:Boolean;
var _local34:Array;
var _local35:int;
var _local36:Array;
var _local37:Array;
var _local38:Array;
_local6 = _arg1.points.length;
_local7 = _arg2.length;
_arg1.updateModel();
_local8 = new Array(_local7);
_local4 = 0;
while (_local4 < _local7) {
_local8[_local4] = _arg1.faces[_arg2[_local4]];
_local4++;
};
_local9 = [];
_local10 = [];
splitPointsByOuter(_local8, _local10, _local9);
_local11 = _local10.length;
_local12 = new Array(_local11);
_local15 = getNormals(_local10, _arg2, _local8, _arg1.faceNormals);
_local4 = 0;
while (_local4 < _local11) {
_local13 = _local10[_local4];
_local14 = _arg1.points[_local13];
_local16 = _local15[_local4];
_local12[_local4] = (_local6 + _local4);
_arg1.points[_local12[_local4]] = [(_local14[0] + (_local16[0] * _arg3)), (_local14[1] + (_local16[1] * _arg3)), (_local14[2] + (_local16[2] * _arg3)), 1];
_local4++;
};
_local17 = _local9.length;
_local4 = 0;
while (_local4 < _local17) {
_local13 = _local9[_local4];
_local14 = _arg1.points[_local13];
_local16 = _arg1.pointNormals[_local13];
_local14[0] = (_local14[0] + (_local16[0] * _arg3));
_local14[1] = (_local14[1] + (_local16[1] * _arg3));
_local14[2] = (_local14[2] + (_local16[2] * _arg3));
_local4++;
};
_local34 = getOuterEdges(_local8);
_local35 = _local34.length;
_local4 = 0;
while (_local4 < _local7) {
_local25 = _local8[_local4];
_local18 = _local25[0];
_local19 = _local25[1];
_local20 = _local25[2];
_local30 = -1;
_local29 = _local30;
_local28 = _local29;
_local33 = false;
_local32 = _local33;
_local31 = _local32;
_local5 = 0;
while (_local5 < _local11) {
if (_local10[_local5] == _local18){
_local28 = _local5;
};
if (_local10[_local5] == _local19){
_local29 = _local5;
};
if (_local10[_local5] == _local20){
_local30 = _local5;
};
_local5++;
};
_local5 = 0;
while (_local5 < _local35) {
if ((((((_local34[_local5][0] == _local18)) && ((_local34[_local5][1] == _local19)))) || ((((_local34[_local5][0] == _local19)) && ((_local34[_local5][1] == _local18)))))){
_local31 = true;
};
if ((((((_local34[_local5][0] == _local19)) && ((_local34[_local5][1] == _local20)))) || ((((_local34[_local5][0] == _local20)) && ((_local34[_local5][1] == _local19)))))){
_local32 = true;
};
if ((((((_local34[_local5][0] == _local20)) && ((_local34[_local5][1] == _local18)))) || ((((_local34[_local5][0] == _local18)) && ((_local34[_local5][1] == _local20)))))){
_local33 = true;
};
_local5++;
};
if (((((_local31) && ((_local28 > -1)))) && ((_local29 > -1)))){
_local23 = _local10[_local28];
_local24 = _local10[_local29];
_local21 = _local12[_local28];
_local22 = _local12[_local29];
_local26 = copyFace(_local25);
_local26[0] = _local23;
_local26[1] = _local24;
_local26[2] = _local22;
_local27 = copyFace(_local25);
_local27[0] = _local23;
_local27[1] = _local22;
_local27[2] = _local21;
_arg1.faces[_arg1.faces.length] = _local26;
_arg1.faces[_arg1.faces.length] = _local27;
};
if (((((_local32) && ((_local29 > -1)))) && ((_local30 > -1)))){
_local23 = _local10[_local29];
_local24 = _local10[_local30];
_local21 = _local12[_local29];
_local22 = _local12[_local30];
_local26 = copyFace(_local25);
_local26[0] = _local23;
_local26[1] = _local24;
_local26[2] = _local22;
_local27 = copyFace(_local25);
_local27[0] = _local23;
_local27[1] = _local22;
_local27[2] = _local21;
_arg1.faces[_arg1.faces.length] = _local26;
_arg1.faces[_arg1.faces.length] = _local27;
};
if (((((_local33) && ((_local30 > -1)))) && ((_local28 > -1)))){
_local23 = _local10[_local30];
_local24 = _local10[_local28];
_local21 = _local12[_local30];
_local22 = _local12[_local28];
_local26 = copyFace(_local25);
_local26[0] = _local23;
_local26[1] = _local24;
_local26[2] = _local22;
_local27 = copyFace(_local25);
_local27[0] = _local23;
_local27[1] = _local22;
_local27[2] = _local21;
_arg1.faces[_arg1.faces.length] = _local26;
_arg1.faces[_arg1.faces.length] = _local27;
};
_local4++;
};
_local4 = 0;
while (_local4 < _local7) {
_local25 = _local8[_local4];
_local28 = isInArray(_local25[0], _local10);
_local29 = isInArray(_local25[1], _local10);
_local30 = isInArray(_local25[2], _local10);
if (_local28 > -1){
_local25[0] = _local12[_local28];
};
if (_local29 > -1){
_local25[1] = _local12[_local29];
};
if (_local30 > -1){
_local25[2] = _local12[_local30];
};
_local4++;
};
_arg1.updateModel();
}
private static function readOBJLine(_arg1:String, _arg2:Model3D, _arg3:Array, _arg4:Array, _arg5:Array):void{
var _local6:String;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:Array;
var _local11:Array;
var _local12:Array;
var _local13:Array;
var _local14:int;
var _local15:int;
_arg1 = removeWhiteSpace(_arg1);
_local10 = _arg1.split(" ");
_local15 = _arg5.length;
switch (_local10[0]){
case "mtllib":
_arg2.loadMTL(_local10[1]);
break;
case "#position":
_arg2.position[0] = Number(_local10[1]);
_arg2.position[1] = Number(_local10[2]);
_arg2.position[2] = Number(_local10[3]);
break;
case "#scale":
_arg2.scale[0] = Number(_local10[1]);
_arg2.scale[1] = Number(_local10[2]);
_arg2.scale[2] = Number(_local10[3]);
break;
case "#rotation":
_arg2.rotation[0] = Number(_local10[1]);
_arg2.rotation[1] = Number(_local10[2]);
_arg2.rotation[2] = Number(_local10[3]);
break;
case "g":
_arg5.length = 0;
if (_local10.length > 1){
_local14 = 1;
while (_local14 < _local10.length) {
_arg5.push(_local10[_local14]);
_local14++;
};
};
break;
case "usemtl":
if ((((_local10.length < 2)) || (!(_local10[1].length)))){
_arg3[0] = null;
} else {
_arg3[0] = _local10[1];
};
break;
case "v":
_arg2.points[_arg2.points.length] = [Number(_local10[1]), Number(_local10[2]), Number(_local10[3]), 1];
_local14 = 0;
while (_local14 < _local15) {
_arg2.addPointToGroup(_arg5[_local14], (_arg2.points.length - 1));
_local14++;
};
break;
case "f":
_local11 = _local10[1].split("/");
_local12 = _local10[2].split("/");
_local13 = _local10[3].split("/");
_arg2.faces[_arg2.faces.length] = [(int(_local11[0]) - 1), (int(_local12[0]) - 1), (int(_local13[0]) - 1)];
initializeFace(_arg2.faces[(_arg2.faces.length - 1)]);
_arg2.faces[(_arg2.faces.length - 1)].material = _arg3[0];
_arg2.faces[(_arg2.faces.length - 1)].smooth = _arg4[0];
_arg2.faces[(_arg2.faces.length - 1)].visible = true;
_local14 = 0;
while (_local14 < _local15) {
_arg2.addFaceToGroup(_arg5[_local14], (_arg2.faces.length - 1));
_local14++;
};
break;
case "s":
_arg4[0] = Boolean(int(_local10[1]));
break;
case "d":
break;
case "o":
_arg2.name = _local10[1];
break;
};
}
public static function splitFace(_arg1:Model3D, _arg2:int){
var _local3:Array;
var _local4:Number;
var _local5:Array;
var _local6:Array;
var _local7:int;
var _local8:int;
var _local9:Array;
_local3 = _arg1.faces[_arg2];
_local4 = (1 / 3);
_local5 = [_arg1.points[_local3[0]], _arg1.points[_local3[1]], _arg1.points[_local3[2]]];
_local6 = [(_local4 * ((_local5[0][0] + _local5[1][0]) + _local5[2][0])), (_local4 * ((_local5[0][1] + _local5[1][1]) + _local5[2][1])), (_local4 * ((_local5[0][2] + _local5[1][2]) + _local5[2][2])), 1];
_local7 = _arg1.points.length;
_local8 = _arg1.faces.length;
_arg1.points[_local7] = _local6;
_local9 = copyFace(_local3);
_local9[0] = _local3[0];
_local9[1] = _local3[1];
_local9[2] = _local7;
var _temp1 = _local8;
_local8 = (_local8 + 1);
var _local10 = _temp1;
_arg1.faces[_local10] = _local9;
_local9 = copyFace(_local3);
_local9[0] = _local3[1];
_local9[1] = _local3[2];
_local9[2] = _local7;
var _temp2 = _local8;
_local8 = (_local8 + 1);
var _local11 = _temp2;
_arg1.faces[_local11] = _local9;
_local9 = copyFace(_local3);
_local9[0] = _local3[2];
_local9[1] = _local3[0];
_local9[2] = _local7;
var _temp3 = _local8;
_local8 = (_local8 + 1);
var _local12 = _temp3;
_arg1.faces[_local12] = _local9;
_arg1.deleteFace(_arg2);
_arg1.updateModel();
}
public static function createCube():Model3D{
var _local1:int;
var _local2:int;
var _local3:int;
var _local4:Model3D;
var _local5:*;
var _local6:*;
var _local7:*;
var _local8:*;
var _local9:int;
_local1 = 0;
_local4 = new Model3D();
var _temp1 = _local1;
_local1 = (_local1 + 1);
var _local10 = _temp1;
_local4.points[_local10] = [0.5, -0.5, 0.5, 1];
var _temp2 = _local1;
_local1 = (_local1 + 1);
var _local11 = _temp2;
_local4.points[_local11] = [0.5, 0.5, 0.5, 1];
var _temp3 = _local1;
_local1 = (_local1 + 1);
var _local12 = _temp3;
_local4.points[_local12] = [-0.5, -0.5, 0.5, 1];
var _temp4 = _local1;
_local1 = (_local1 + 1);
var _local13 = _temp4;
_local4.points[_local13] = [-0.5, 0.5, 0.5, 1];
var _temp5 = _local1;
_local1 = (_local1 + 1);
var _local14 = _temp5;
_local4.points[_local14] = [-0.5, -0.5, -0.5, 1];
var _temp6 = _local1;
_local1 = (_local1 + 1);
var _local15 = _temp6;
_local4.points[_local15] = [-0.5, 0.5, -0.5, 1];
var _temp7 = _local1;
_local1 = (_local1 + 1);
var _local16 = _temp7;
_local4.points[_local16] = [0.5, -0.5, -0.5, 1];
var _temp8 = _local1;
_local1 = (_local1 + 1);
var _local17 = _temp8;
_local4.points[_local17] = [0.5, 0.5, -0.5, 1];
_local3 = 0;
_local2 = 0;
while (_local2 < (4 * 2)) {
_local5 = _local2;
_local6 = ((_local2 + 1) % _local1);
_local8 = ((_local2 + 2) % _local1);
_local9 = ((_local2 + 3) % _local1);
var _temp9 = _local3;
_local3 = (_local3 + 1);
var _local18 = _temp9;
_local4.faces[_local18] = [_local8, _local5, _local6];
var _temp10 = _local3;
_local3 = (_local3 + 1);
var _local19 = _temp10;
_local4.faces[_local19] = [_local8, _local6, _local9];
_local2 = (_local2 + 2);
};
var _temp11 = _local3;
_local3 = (_local3 + 1);
_local18 = _temp11;
_local4.faces[_local18] = [3, 1, 7];
var _temp12 = _local3;
_local3 = (_local3 + 1);
_local19 = _temp12;
_local4.faces[_local19] = [3, 7, 5];
var _temp13 = _local3;
_local3 = (_local3 + 1);
var _local20 = _temp13;
_local4.faces[_local20] = [0, 4, 6];
var _temp14 = _local3;
_local3 = (_local3 + 1);
var _local21 = _temp14;
_local4.faces[_local21] = [0, 2, 4];
_local4.updateModel();
_local4.updateMatrix();
_local4.setGlobalAsLocal();
_local4.scale = [1, 1, 1];
return (_local4);
}
public static function createTorus(_arg1:int, _arg2:int, _arg3:Number=1, _arg4:Number=1){
var _local5:Array;
var _local6:Number;
var _local7:int;
_local5 = new Array(_arg1);
_local6 = ((Math.PI * 2) / _arg1);
_local7 = 0;
while (_local7 <= _arg1) {
_local5[_local7] = [(_arg4 + (Math.cos(((_local6 * _local7) - (Math.PI * 0.5))) * _arg3)), (-(Math.sin(((_local6 * _local7) - (Math.PI * 0.5)))) * _arg3)];
_local7++;
};
return (createToroid(_local5, _arg2));
}
public static function invertFaceNormal(_arg1:Array){
var _local2:int;
_local2 = _arg1[0];
_arg1[0] = _arg1[1];
_arg1[1] = _local2;
}
public static function readMTL(_arg1:String, _arg2:Model3D):void{
var _local3:int;
var _local4:int;
var _local5:String;
var _local6:int;
var _local7:Array;
var _local8:int;
var _local9:int;
_local3 = 0;
_local4 = _arg1.length;
_local7 = [];
while (_local3 < _local4) {
_local6 = _arg1.indexOf("\n", _local3);
if (_local6 == -1){
_local6 = _local4;
};
_local5 = _arg1.slice(_local3, _local6);
readMTLLine(_local5, _local7);
_local3 = _local4;
_local3 = (_local6 + 1);
};
_local8 = _local7.length;
_local9 = 0;
while (_local9 < _local8) {
_arg2.addMaterial(_local7[_local9]);
_local9++;
};
}
public static function joinTrianglesByPoint(_arg1:Model3D, _arg2:int):Boolean{
var _local3:Array;
var _local4:int;
var _local5:Array;
var _local6:int;
_local3 = [];
_local5 = _arg1.faces;
_local6 = _local5.length;
_local4 = 0;
while (_local4 < _local6) {
if ((((((_local5[_local4][0] == _arg2)) || ((_local5[_local4][1] == _arg2)))) || ((_local5[_local4][2] == _arg2)))){
_local3[_local3.length] = _local4;
};
_local4++;
};
if (_local3.length != 3){
return (false);
};
return (joinTriangles(_arg1, _local3[0], _local3[1], _local3[2]));
}
public static function getOuterEdges(_arg1:Array):Array{
var _local2:int;
var _local3:Array;
var _local4:Array;
var _local5:Array;
var _local6:Array;
var _local7:Array;
var _local8:int;
var _local9:int;
var _local10:int;
var _local11:int;
_local2 = _arg1.length;
_local3 = [];
_local6 = [false, false, false];
_local7 = [];
_local9 = 0;
while (_local9 < _local2) {
_local4 = _arg1[_local9];
_local5 = [];
_local5[0] = ((_local4[0])<_local4[1]) ? [_local4[0], _local4[1]] : [_local4[1], _local4[0]];
_local5[1] = ((_local4[1])<_local4[2]) ? [_local4[1], _local4[2]] : [_local4[2], _local4[1]];
_local5[2] = ((_local4[2])<_local4[0]) ? [_local4[2], _local4[0]] : [_local4[0], _local4[2]];
_local6[0] = false;
_local6[1] = false;
_local6[2] = false;
_local8 = _local3.length;
_local11 = 0;
while (_local11 < _local8) {
if ((((_local3[_local11][0] == _local5[0][0])) && ((_local3[_local11][1] == _local5[0][1])))){
_local6[0] = true;
_local7[_local11] = true;
};
if ((((_local3[_local11][0] == _local5[1][0])) && ((_local3[_local11][1] == _local5[1][1])))){
_local6[1] = true;
_local7[_local11] = true;
};
if ((((_local3[_local11][0] == _local5[2][0])) && ((_local3[_local11][1] == _local5[2][1])))){
_local6[2] = true;
_local7[_local11] = true;
};
_local11++;
};
if (!_local6[0]){
_local3[_local3.length] = _local5[0];
_local7[(_local3.length - 1)] = false;
};
if (!_local6[1]){
_local3[_local3.length] = _local5[1];
_local7[(_local3.length - 1)] = false;
};
if (!_local6[2]){
_local3[_local3.length] = _local5[2];
_local7[(_local3.length - 1)] = false;
};
_local9++;
};
_local10 = (_local7.length - 1);
_local9 = _local10;
while (_local9 >= 0) {
if (_local7[_local9]){
_local3.splice(_local9, 1);
};
_local9--;
};
return (_local3);
}
public static function joinTriangles(_arg1:Model3D, _arg2:int, _arg3:int, _arg4:int):Boolean{
var _local5:Array;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:Boolean;
var _local11:int;
var _local12:Array;
var _local13:Array;
_local5 = [_arg1.faces[_arg2], _arg1.faces[_arg3], _arg1.faces[_arg4]];
if (((((!(_local5[0])) || (!(_local5[1])))) || (!(_local5[2])))){
trace("One of the triangles does not exist");
return (false);
};
_local6 = 0;
_local10 = false;
_local12 = [];
_local7 = 0;
while (_local7 < 3) {
if (isInArray(_local5[0][_local7], _local12) < 0){
_local12[_local12.length] = _local5[0][_local7];
};
if (isInArray(_local5[1][_local7], _local12) < 0){
_local12[_local12.length] = _local5[1][_local7];
};
if (isInArray(_local5[2][_local7], _local12) < 0){
_local12[_local12.length] = _local5[2][_local7];
};
_local7++;
};
if (_local12.length != 4){
trace("Not 4 points:", _local12);
return (false);
};
_local7 = 0;
while (_local7 < 3) {
_local8 = 0;
while (_local8 < 3) {
_local9 = 0;
while (_local9 < 3) {
if ((((_local5[0][_local7] == _local5[1][_local8])) && ((_local5[1][_local8] == _local5[2][_local9])))){
_local6 = _local5[0][_local7];
_local11 = _local7;
_local10 = true;
break;
};
_local9++;
};
if (_local10){
break;
};
_local8++;
};
if (_local10){
break;
};
_local7++;
};
if (!_local10){
trace(((((("No point in common.\n F1:" + _local5[0]) + "\n F2:") + _local5[1]) + "\n F3:") + _local5[2]));
return (false);
};
_local13 = [];
_local13[0] = _local5[0][((_local11 + 1) % 3)];
_local13[1] = _local5[0][((_local11 + 2) % 3)];
_local7 = 0;
while (_local7 < 3) {
if (_local5[1][_local7] != _local5[0][_local7]){
_local13[2] = _local5[1][_local7];
};
_local7++;
};
_local13.material = _local5[0].material;
_local13.smooth = _local5[0].smooth;
_local13.visible = true;
_arg1.faces[_arg1.faces.length] = _local13;
_arg1.deleteFace(_arg2);
if (_arg3 > _arg2){
_arg1.deleteFace((_arg3 - 1));
} else {
_arg1.deleteFace(_arg3);
};
if (_arg4 > _arg3){
if (_arg4 > _arg2){
_arg1.deleteFace((_arg4 - 2));
} else {
_arg1.deleteFace((_arg4 - 1));
};
} else {
if (_arg4 > _arg2){
_arg1.deleteFace((_arg4 - 1));
} else {
_arg1.deleteFace(_arg4);
};
};
_arg1.deletePoint(_local6);
return (true);
}
public static function insertUniqueOrdered(_arg1:Array, _arg2:int){
var _local3:int;
var _local4:int;
_local3 = _arg1.length;
_local4 = 0;
while (_local4 < _local3) {
if (_arg1[_local4] == _arg2){
return;
};
if (_arg1[_local4] > _arg2){
break;
};
_local4++;
};
_arg1.splice(_local4, 0, _arg2);
}
public static function fusePoints(_arg1:Model3D, _arg2:Array){
var _local3:int;
var _local4:int;
var _local5:Array;
var _local6:Number;
var _local7:Array;
var _local8:int;
var _local9:Array;
var _local10:Array;
var _local11:Array;
var _local12:int;
var _local13:int;
var _local14:int;
var _local15:int;
var _local16:int;
_local3 = _arg2.length;
if (_local3 < 2){
return;
};
_local4 = _arg2[0];
_local5 = [0, 0, 0];
_local13 = 0;
while (_local13 < _local3) {
_local5[0] = (_local5[0] + _arg1.points[_arg2[_local13]][0]);
_local5[1] = (_local5[1] + _arg1.points[_arg2[_local13]][1]);
_local5[2] = (_local5[2] + _arg1.points[_arg2[_local13]][2]);
_local13++;
};
_local6 = (1 / _local3);
_local5[0] = (_local5[0] * _local6);
_local5[1] = (_local5[1] * _local6);
_local5[2] = (_local5[2] * _local6);
_arg1.points[_local4][0] = _local5[0];
_arg1.points[_local4][1] = _local5[1];
_arg1.points[_local4][2] = _local5[2];
_local7 = _arg1.faces;
_local8 = _local7.length;
_local9 = [];
_local13 = 1;
while (_local13 < _local3) {
_local12 = _arg2[_local13];
_local14 = 0;
while (_local14 < _local8) {
_local10 = _local7[_local14];
if (_local10[0] == _local12){
_local10[0] = _local4;
};
if (_local10[1] == _local12){
_local10[1] = _local4;
};
if (_local10[2] == _local12){
_local10[2] = _local4;
};
_local14++;
};
_local13++;
};
_local15 = 0;
_local13 = 0;
while (_local13 < (_local7.length - 1)) {
_local10 = _local7[_local13];
if ((((((((_local10[0] == _local10[1])) || ((_local10[0] == _local10[2])))) || ((_local10[1] == _local10[2])))) && ((isInArray(_local13, _local9) < 0)))){
_local9[_local9.length] = _local13;
};
_local13++;
};
_local16 = _local9.length;
_local13 = (_local16 - 1);
while (_local13 >= 0) {
_arg1.deleteFace(_local9[_local13]);
_local14 = 0;
while (_local14 < _local13) {
if (_local9[_local14] > _local9[_local13]){
var _local17 = _local9;
var _local18 = _local14;
var _local19 = (_local17[_local18] - 1);
_local17[_local18] = _local19;
};
_local14++;
};
_local13--;
};
_local13 = 1;
while (_local13 < _local3) {
_arg1.deletePoint(_arg2[_local13]);
_local14 = (_local13 + 1);
while (_local14 < _local3) {
if (_arg2[_local14] > _arg2[_local13]){
_local17 = _arg2;
_local18 = _local14;
_local19 = (_local17[_local18] - 1);
_local17[_local18] = _local19;
};
_local14++;
};
_local13++;
};
_arg1.clean();
_arg1.updateModel();
}
public static function extrude(_arg1:Array, _arg2:int, _arg3:Number=100, _arg4:Boolean=false):Model3D{
var _local5:Model3D;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:int;
var _local11:int;
var _local12:int;
var _local13:int;
var _local14:Number;
var _local15:Number;
var _local16:Number;
var _local17:Number;
var _local18:int;
var _local19:Number;
var _local20:Number;
var _local21:Number;
var _local22:Number;
var _local23:int;
var _local24:int;
_local5 = new Model3D();
_local6 = _arg1.length;
_local7 = 0;
_local8 = 0;
_local14 = Infinity;
_local15 = Infinity;
_local16 = -(Infinity);
_local17 = -(Infinity);
_arg2++;
while (_local18 < _arg2) {
_local9 = (_local18 * _local6);
_local10 = ((_local18 + 1) * _local6);
_local24 = 0;
while (_local24 < _local6) {
_local14 = Math.min(_arg1[_local24][0], _local14);
_local16 = Math.max(_arg1[_local24][0], _local16);
_local15 = Math.min(_arg1[_local24][1], _local15);
_local17 = Math.max(_arg1[_local24][1], _local17);
_local11 = _local24;
_local12 = ((_local24 + 1) % _local6);
_local5.points[(_local9 + _local11)] = [_arg1[_local24][0], _arg1[_local24][1], Number((_local18 * _arg3)), 1];
if (_local18 < (_arg2 - 1)){
var _temp1 = _local8;
_local8 = (_local8 + 1);
var _local25 = _temp1;
_local5.faces[_local25] = [(_local9 + _local11), (_local10 + _local11), (_local9 + _local12)];
var _temp2 = _local8;
_local8 = (_local8 + 1);
var _local26 = _temp2;
_local5.faces[_local26] = [(_local9 + _local12), (_local10 + _local11), (_local10 + _local12)];
};
_local24++;
};
_local18++;
};
_local19 = ((_local16 + _local14) * 0.5);
_local20 = ((_local17 + _local15) * 0.5);
_local21 = (_arg2 * _local6);
_local22 = ((_arg2 * _arg3) * 0.5);
_local18 = 0;
while (_local18 < (_arg2 * _local6)) {
_local5.points[_local18][0] = (_local5.points[_local18][0] - _local19);
_local5.points[_local18][1] = (_local5.points[_local18][1] - _local20);
_local18++;
};
if (_arg4){
_local5.points[_local21] = [0, 0, 0, 1];
_local5.points[(_local21 + 1)] = [0, 0, ((_arg2 - 1) * _arg3), 1];
_local18 = 0;
while (_local18 < _local6) {
var _temp3 = _local8;
_local8 = (_local8 + 1);
_local25 = _temp3;
_local5.faces[_local25] = [_local18, ((_local18 + 1) % _local6), _local21];
var _temp4 = _local8;
_local8 = (_local8 + 1);
_local26 = _temp4;
_local5.faces[_local26] = [(((_arg2 - 1) * _local6) + ((_local18 + 1) % _local6)), (((_arg2 - 1) * _local6) + _local18), (_local21 + 1)];
_local18++;
};
};
_local23 = _local5.points.length;
_local18 = 0;
while (_local18 < _local23) {
_local5.points[_local18][2] = (_local5.points[_local18][2] - _local22);
_local18++;
};
_local5.scale = [1, 1, 1];
_local5.position = [0, 0, 0];
_local5.updateModel();
_local5.updateMatrix();
return (_local5);
}
public static function writeOBJ(_arg1:Model3D, _arg2:String=null, _arg3:Boolean=true):String{
var _local4:String;
var _local5:int;
var _local6:int;
var _local7:int;
var _local8:Array;
var _local9:int;
var _local10:Array;
var _local11:Array;
var _local12:Boolean;
var _local13:int;
var _local14:int;
var _local15:String;
var _local16:Array;
var _local17:Array;
var _local18:Boolean;
_local4 = "";
_arg1.updateModel();
_arg1.updateMatrix();
_local6 = _arg1.points.length;
_local7 = _arg1.faces.length;
_local4 = (("#MODEL " + _arg1.name) + ".obj\n");
if (((_arg1.name) && (_arg1.name.length))){
_local4 = (_local4 + (("o " + _arg1.name) + "\n\n"));
};
if (((_arg2) && (_arg2.length))){
_local4 = (_local4 + "#MATERIALS\n");
_local4 = (_local4 + (("mtllib " + _arg2) + "\n\n"));
};
if (_arg3){
_local4 = (_local4 + (((((("#position " + _arg1.position[0].toFixed(3)) + " ") + _arg1.position[1].toFixed(3)) + " ") + _arg1.position[2].toFixed(3)) + "\n"));
_local4 = (_local4 + (((((("#scale " + _arg1.scale[0].toFixed(3)) + " ") + _arg1.scale[1].toFixed(3)) + " ") + _arg1.scale[2].toFixed(3)) + "\n"));
_local4 = (_local4 + (((((("#rotation " + _arg1.rotation[0].toFixed(3)) + " ") + _arg1.rotation[1].toFixed(3)) + " ") + _arg1.rotation[2].toFixed(3)) + "\n"));
};
_local4 = (_local4 + "#POINTS\n");
_local4 = (_local4 + (("#NUM VERTICES: " + _local6) + "\n"));
_local10 = [];
_local12 = false;
_local14 = 0;
_local5 = 0;
while (_local5 < _local6) {
_local12 = false;
_local11 = _arg1.getGroupsFromPoint(_local5);
_local13 = _local11.length;
_local9 = 0;
while (_local9 < _local13) {
if (isInArray(_local11[_local9], _local10) < 0){
_local12 = true;
break;
};
_local9++;
};
_local9 = 0;
while (((!(_local12)) && ((_local9 < _local14)))) {
if (isInArray(_local10[_local9], _local11) < 0){
_local12 = true;
break;
};
_local9++;
};
if (_local12){
_local10 = _local11.concat();
_local14 = _local13;
_local4 = (_local4 + (("g " + _local10.join(" ")) + "\n"));
};
_local8 = _arg1.points[_local5];
_local4 = (_local4 + (((((("v " + _local8[0].toFixed(3)) + " ") + _local8[1].toFixed(3)) + " ") + _local8[2].toFixed(3)) + "\n"));
_local5++;
};
_local15 = null;
_local17 = _arg1.materials;
_local18 = false;
_local4 = (_local4 + "#FACES\n");
_local4 = (_local4 + (("#NUM FACES: " + _local7) + "\n"));
_local5 = 0;
while (_local5 < _local7) {
_local12 = false;
_local11 = _arg1.getGroupsFromFace(_local5);
_local13 = _local11.length;
_local9 = 0;
while (_local9 < _local13) {
if (isInArray(_local11[_local9], _local10) < 0){
_local12 = true;
break;
};
_local9++;
};
_local9 = 0;
while (((!(_local12)) && ((_local9 < _local14)))) {
if (isInArray(_local10[_local9], _local11) < 0){
_local12 = true;
break;
};
_local9++;
};
if (_local12){
_local10 = _local11;
_local14 = _local13;
_local4 = (_local4 + (("g " + _local10.join(" ")) + "\n"));
};
_local16 = _arg1.faces[_local5];
if (_local16.smooth != _local18){
_local18 = _local16.smooth;
_local4 = (_local4 + (_local16.smooth) ? "s 1\n" : "s 0\n");
};
if (((_arg2) && (_arg2.length))){
if (_local16.material != _local15){
_local15 = _local16.material;
if (((_local16.material) && (_local16.material.length))){
_local4 = (_local4 + (("usemtl " + _local16.material) + "\n"));
} else {
_local4 = (_local4 + "usemtl\n");
};
};
};
_local4 = (_local4 + (((((("f " + (_local16[0] + 1)) + " ") + (_local16[1] + 1)) + " ") + (_local16[2] + 1)) + "\n"));
_local5++;
};
return (_local4);
}
public static function getPoints(_arg1:Array):Array{
var _local2:int;
var _local3:int;
var _local4:Array;
var _local5:int;
var _local6:int;
var _local7:Array;
var _local8:Array;
_local2 = _arg1.length;
_local7 = [];
_local8 = [false, false, false];
_local5 = 0;
while (_local5 < _local2) {
_local4 = _arg1[_local5];
_local8[0] = false;
_local8[1] = false;
_local8[2] = false;
_local3 = _local7.length;
_local6 = 0;
while (_local6 < _local3) {
if (_local4[0] == _local7[_local6]){
_local8[0] = true;
};
if (_local4[1] == _local7[_local6]){
_local8[1] = true;
};
if (_local4[2] == _local7[_local6]){
_local8[2] = true;
};
_local6++;
};
if (!_local8[0]){
_local7[_local7.length] = _local4[0];
};
if (!_local8[1]){
_local7[_local7.length] = _local4[1];
};
if (!_local8[2]){
_local7[_local7.length] = _local4[2];
};
_local5++;
};
return (_local7);
}
public static function createSphere(_arg1:int, _arg2:int, _arg3:Number):Model3D{
var _local4:int;
var _local5:Array;
var _local6:Number;
var _local7:Model3D;
if (_arg1 < 1){
_arg1 = 1;
};
if (_arg2 < 3){
_arg2 = 3;
};
_local5 = new Array(_arg1);
_local6 = (Math.PI / (_arg1 + 1));
_local4 = 1;
while (_local4 <= _arg1) {
_local5[(_local4 - 1)] = [(Math.cos(((_local6 * _local4) - (Math.PI * 0.5))) * _arg3), (-(Math.sin(((_local6 * _local4) - (Math.PI * 0.5)))) * _arg3)];
_local4++;
};
_local7 = createRotational(_local5, _arg2);
_local7.points[(_local7.points.length - 2)][1] = _arg3;
_local7.points[(_local7.points.length - 1)][1] = -(_arg3);
_local7.updateModel();
return (_local7);
}
public static function connectPointsIntoFace(_arg1:Model3D, _arg2:int, _arg3:int, _arg4:int):Boolean{
var _local5:Array;
var _local6:Array;
var _local7:Array;
var _local8:Array;
var _local9:Array;
var _local10:Array;
var _local11:Array;
_local5 = _arg1.faces;
_local6 = getFacesByLine(_local5, _arg2, _arg3);
_local7 = getFacesByLine(_local5, _arg3, _arg4);
_local8 = getFacesByLine(_local5, _arg4, _arg2);
if ((((((_local6.length > 1)) || ((_local7.length > 1)))) || ((_local8.length > 1)))){
return (false);
};
if (((_local6.length + _local7.length) + _local8.length) < 1){
return (false);
};
_local10 = [];
if (_local6.length){
_local9 = _arg1.faces[_local6[0]];
} else {
if (_local7.length){
_local9 = _arg1.faces[_local7[0]];
} else {
if (_local8.length){
_local9 = _arg1.faces[_local8[0]];
};
};
};
if (_local9[0] == _arg2){
_local10[_local10.length] = 0;
};
if (_local9[0] == _arg3){
_local10[_local10.length] = 0;
};
if (_local9[0] == _arg4){
_local10[_local10.length] = 0;
};
if (_local9[1] == _arg2){
_local10[_local10.length] = 1;
};
if (_local9[1] == _arg3){
_local10[_local10.length] = 1;
};
if (_local9[1] == _arg4){
_local10[_local10.length] = 1;
};
if (_local9[2] == _arg2){
_local10[_local10.length] = 2;
};
if (_local9[2] == _arg3){
_local10[_local10.length] = 2;
};
if (_local9[2] == _arg4){
_local10[_local10.length] = 2;
};
_local11 = [0, 0, 0];
if (_local10[1] == ((_local10[0] + 1) % 3)){
_local11[0] = _local9[_local10[1]];
_local11[1] = _local9[_local10[0]];
} else {
_local11[0] = _local9[_local10[0]];
_local11[1] = _local9[_local10[1]];
};
if (((!((_arg2 == _local9[_local10[0]]))) && (!((_arg2 == _local9[_local10[1]]))))){
_local11[2] = _arg2;
};
if (((!((_arg3 == _local9[_local10[0]]))) && (!((_arg3 == _local9[_local10[1]]))))){
_local11[2] = _arg3;
};
if (((!((_arg4 == _local9[_local10[0]]))) && (!((_arg4 == _local9[_local10[1]]))))){
_local11[2] = _arg4;
};
_local11.smooth = _local9.smooth;
_local11.material = _local9.material;
_local11.visible = true;
_arg1.faces[_arg1.faces.length] = _local11;
return (true);
}
public static function getSharedLines(_arg1:Model3D, _arg2:Array):Array{
var _local3:int;
var _local4:Array;
var _local5:Array;
var _local6:int;
var _local7:int;
var _local8:Array;
var _local9:Array;
_local3 = _arg2.length;
_local8 = [];
_local6 = 0;
while (_local6 < (_local3 - 1)) {
_local4 = _arg1.faces[_arg2[_local6]];
_local7 = (_local6 + 1);
while (_local7 < _local3) {
_local5 = _arg1.faces[_arg2[_local7]];
_local9 = getSharedLine(_local4, _local5);
if (_local9.length == 2){
_local8.push(_local9);
};
_local7++;
};
_local6++;
};
return (_local8);
}
public static function splitLine(_arg1:Model3D, _arg2:int, _arg3:int):Boolean{
var _local4:Array;
var _local5:Array;
var _local6:Array;
var _local7:Array;
var _local8:Array;
var _local9:Array;
var _local10:int;
var _local11:Array;
var _local12:String;
var _local13:Boolean;
var _local14:String;
var _local15:Boolean;
var _local16:Array;
var _local17:Array;
var _local18:Array;
var _local19:Array;
var _local20:int;
_local4 = (_arg1.faces[_arg2] as Array);
_local5 = (_arg1.faces[_arg3] as Array);
if (((!(_local4)) || (!(_local5)))){
return (false);
};
_local6 = [];
_local7 = [];
if (_local4[0] == _local5[0]){
_local6[_local6.length] = 0;
};
if (_local4[0] == _local5[1]){
_local6[_local6.length] = 0;
};
if (_local4[0] == _local5[2]){
_local6[_local6.length] = 0;
};
if (_local4[1] == _local5[0]){
_local6[_local6.length] = 1;
};
if (_local4[1] == _local5[1]){
_local6[_local6.length] = 1;
};
if (_local4[1] == _local5[2]){
_local6[_local6.length] = 1;
};
if (_local4[2] == _local5[0]){
_local6[_local6.length] = 2;
};
if (_local4[2] == _local5[1]){
_local6[_local6.length] = 2;
};
if (_local4[2] == _local5[2]){
_local6[_local6.length] = 2;
};
if (_local6.length != 2){
return (false);
};
if (((((_local6[1] - _local6[0]) == -1)) || (((_local6[1] - _local6[0]) == 2)))){
_local20 = _local6[1];
_local6[1] = _local6[0];
_local6[0] = _local20;
};
if (((!((_local4[0] == _local4[_local6[0]]))) && (!((_local4[0] == _local4[_local6[1]]))))){
_local7[0] = 0;
};
if (((!((_local4[1] == _local4[_local6[0]]))) && (!((_local4[1] == _local4[_local6[1]]))))){
_local7[0] = 1;
};
if (((!((_local4[2] == _local4[_local6[0]]))) && (!((_local4[2] == _local4[_local6[1]]))))){
_local7[0] = 2;
};
if (((!((_local5[0] == _local4[_local6[0]]))) && (!((_local5[0] == _local4[_local6[1]]))))){
_local7[1] = 0;
};
if (((!((_local5[1] == _local4[_local6[0]]))) && (!((_local5[1] == _local4[_local6[1]]))))){
_local7[1] = 1;
};
if (((!((_local5[2] == _local4[_local6[0]]))) && (!((_local5[2] == _local4[_local6[1]]))))){
_local7[1] = 2;
};
if (_local7.length != 2){
return (false);
};
_local8 = _arg1.points[_local4[_local6[0]]];
_local9 = _arg1.points[_local4[_local6[1]]];
_local10 = _arg1.points.length;
_local11 = [(0.5 * (_local8[0] + _local9[0])), (0.5 * (_local8[1] + _local9[1])), (0.5 * (_local8[2] + _local9[2])), 1];
_arg1.points[_local10] = _local11;
_local12 = _local4.material;
_local13 = _local4.smooth;
_local14 = _local5.material;
_local15 = _local5.smooth;
_local16 = [_local4[_local7[0]], _local4[_local6[0]], _local10];
_local17 = [_local4[_local7[0]], _local10, _local4[_local6[1]]];
_local18 = [_local5[_local7[1]], _local4[_local6[1]], _local10];
_local19 = [_local5[_local7[1]], _local10, _local4[_local6[0]]];
_local17.material = (_local16.material = _local12);
_local19.material = (_local18.material = _local14);
_local16.smooth = (_local17.smooth = _local13);
_local18.smooth = (_local19.smooth = _local15);
_local17.visible = (_local16.visible = (_local19.visible = (_local18.visible = true)));
_arg1.faces[_arg1.faces.length] = _local16;
_arg1.faces[_arg1.faces.length] = _local17;
_arg1.faces[_arg1.faces.length] = _local18;
_arg1.faces[_arg1.faces.length] = _local19;
_arg1.deleteFace(_arg2);
if (_arg3 > _arg2){
_arg1.deleteFace((_arg3 - 1));
} else {
_arg1.deleteFace(_arg3);
};
_arg1.updateModel();
return (true);
}
public static function createToroid(_arg1:Array, _arg2:int){
return (createRotational(_arg1, _arg2, false, true));
}
public static function isInArray(_arg1, _arg2:Array):int{
var _local3:int;
var _local4:int;
_local3 = _arg2.length;
_local4 = 0;
while (_local4 < _local3) {
if (_arg2[_local4] == _arg1){
return (_local4);
};
_local4++;
};
return (-1);
}
public static function createCylinder(_arg1:int, _arg2:int, _arg3:Number, _arg4:Number, _arg5:Boolean=true){
var _local6:Array;
var _local7:Number;
var _local8:int;
_local6 = [];
_local7 = ((Math.PI * 2) / _arg1);
_local8 = 0;
while (_local8 < _arg1) {
_local6[_local8] = [(-(Math.cos((_local7 * _local8))) * _arg3), (Math.sin((_local7 * _local8)) * _arg3)];
_local8++;
};
return (extrude(_local6, _arg2, (_arg4 / (_arg2 + 1)), _arg5));
}
public static function getLineFromMouse(_arg1:Camera3D, _arg2:int, _arg3:int){
}
public static function getNormals(_arg1:Array, _arg2:Array, _arg3:Array, _arg4:Array):Array{
var _local5:Array;
var _local6:int;
var _local7:int;
var _local8:int;
var _local9:int;
var _local10:Array;
var _local11:int;
var _local12:int;
var _local13:int;
_local5 = [];
_local6 = _arg1.length;
_local7 = _arg2.length;
_local12 = 0;
while (_local12 < _local6) {
_local9 = _arg1[_local12];
_local11 = 0;
_local5[_local12] = [0, 0, 0];
_local13 = 0;
while (_local13 < _local7) {
_local10 = _arg3[_local13];
_local8 = _arg2[_local13];
if ((((((_local10[0] == _local9)) || ((_local10[1] == _local9)))) || ((_local10[2] == _local9)))){
_local11++;
_local5[_local12][0] = (_local5[_local12][0] + _arg4[_local8][0]);
_local5[_local12][1] = (_local5[_local12][1] + _arg4[_local8][1]);
_local5[_local12][2] = (_local5[_local12][2] + _arg4[_local8][2]);
};
_local13++;
};
_local5[_local12][0] = (_local5[_local12][0] / _local11);
_local5[_local12][1] = (_local5[_local12][1] / _local11);
_local5[_local12][2] = (_local5[_local12][2] / _local11);
_local12++;
};
return (_local5);
}
public static function copyFace(_arg1:Array):Array{
var _local2:Array;
_local2 = [];
_local2[0] = _arg1[0];
_local2[1] = _arg1[1];
_local2[2] = _arg1[2];
if (_arg1.material){
_local2.material = _arg1.material;
} else {
_local2.material = "";
};
if (!_arg1.smooth){
_local2.smooth = false;
} else {
_local2.smooth = _arg1.smooth;
};
if ((((_arg1.visible == undefined)) || ((_arg1.visible == null)))){
_local2.visible = true;
} else {
_local2.visible = _arg1.visible;
};
return (_local2);
}
public static function splitFaces(_arg1:Model3D, _arg2:Array){
var _local3:Array;
var _local4:Array;
var _local5:int;
var _local6:int;
var _local7:int;
var _local8:int;
_local3 = _arg2.concat();
_local4 = [];
_local5 = 0;
_local6 = 0;
while (_local3.length) {
_local5 = -1;
_local6 = _local5;
_local7 = 0;
while (_local7 < _local3.length) {
if (_local3[_local7] > _local5){
_local5 = _local3[_local7];
_local6 = _local7;
};
_local7++;
};
_local4.push(_local5);
_local3.splice(_local6, 1);
};
_local8 = _local4.length;
_local7 = 0;
while (_local7 < _local8) {
splitFace(_arg1, _local4[_local7]);
_local7++;
};
}
public static function getSharedLine(_arg1:Array, _arg2:Array):Array{
var _local3:int;
var _local4:Array;
_local4 = [];
if (_arg1[0] == _arg2[0]){
_local4[_local4.length] = _arg1[0];
};
if (_arg1[0] == _arg2[1]){
_local4[_local4.length] = _arg1[0];
};
if (_arg1[0] == _arg2[2]){
_local4[_local4.length] = _arg1[0];
};
if (_arg1[1] == _arg2[0]){
_local4[_local4.length] = _arg1[1];
};
if (_arg1[1] == _arg2[1]){
_local4[_local4.length] = _arg1[1];
};
if (_arg1[1] == _arg2[2]){
_local4[_local4.length] = _arg1[1];
};
if (_arg1[2] == _arg2[0]){
_local4[_local4.length] = _arg1[2];
};
if (_arg1[2] == _arg2[1]){
_local4[_local4.length] = _arg1[2];
};
if (_arg1[2] == _arg2[2]){
_local4[_local4.length] = _arg1[2];
};
if (_local4.length == 2){
return (_local4);
};
if (_local4[0] > _local4[1]){
_local3 = _local4[0];
_local4[0] = _local4[1];
_local4[1] = _local3;
};
return ([]);
}
public static function isWhiteSpace(_arg1:String):Boolean{
return ((((((_arg1 == " ")) || ((_arg1 == "\t")))) || ((_arg1 == "\r"))));
}
}
}//package pixels3d
Section 8
//Stage3D (pixels3d.Stage3D)
package pixels3d {
import flash.utils.*;
public final class Stage3D {
private var _models:Array;
private var _ambient:Array;
public var bgColor:uint;
private var _lights:Array;
public function Stage3D(){
_models = [];
_lights = [];
_ambient = [0, 0, 0];
bgColor = 4294967295;
}
public function getLightAt(_arg1:int):Light3D{
if ((((_arg1 > _lights.length)) || ((_arg1 < 0)))){
return (null);
};
return (_lights[_arg1]);
}
public function draw(_arg1:Camera3D){
var _local2:int;
var _local3:int;
var _local4:int;
var _local5:int;
var _local6:int;
_local5 = 0;
_arg1.resetZBuffer();
_arg1.canvas.lock();
_arg1.canvas.fillRect(_arg1.screenSize, bgColor);
_local6 = _models.length;
_local5 = 0;
while (_local5 < _local6) {
_local2 = getTimer();
if (!_models[_local5].visible){
} else {
_models[_local5].draw(_arg1, _lights, _ambient);
_local3 = getTimer();
};
_local5++;
};
_arg1.canvas.unlock();
}
public function removeModel(_arg1:Model3D):void{
var _local2:int;
var _local3:int;
_local2 = _models.length;
_local3 = 0;
while (_local3 < _local2) {
if (_models[_local3] == _arg1){
removeModelAt(_local3);
return;
};
_local3++;
};
}
public function getModelAt(_arg1:int):Model3D{
if ((((_arg1 > _models.length)) || ((_arg1 < 0)))){
return (null);
};
return (_models[_arg1]);
}
public function addModel(_arg1:Model3D):void{
if (getModel(_arg1) > -1){
return;
};
_models.push(_arg1);
}
public function removeLightAt(_arg1:int):void{
delete _lights[_arg1];
_lights.splice(_arg1, 1);
}
public function addLightAt(_arg1:Light3D, _arg2:int):void{
var _local3:*;
var _local4:int;
removeLight(_arg1);
_local3 = _lights.length;
_local4 = _local3;
while (_local4 > _arg2) {
(_lights[_local4] == _lights[(_local4 - 1)]);
_local4++;
};
_lights[_arg2] = _arg2;
}
public function removeModelAt(_arg1:int):void{
delete _models[_arg1];
_models.splice(_arg1, 1);
}
public function addModelAt(_arg1:Model3D, _arg2:int):void{
var _local3:*;
var _local4:int;
removeModel(_arg1);
_local3 = _models.length;
_local4 = _local3;
while (_local4 > _arg2) {
(_models[_local4] == _models[(_local4 - 1)]);
_local4++;
};
_models[_arg2] = _arg2;
}
public function get lights():Array{
return (_lights);
}
public function get ambient():Array{
return (_ambient);
}
public function getLight(_arg1:Light3D):int{
var _local2:int;
var _local3:int;
_local2 = _lights.length;
_local3 = 0;
while (_local3 < _local2) {
if (_lights[_local3] == _arg1){
return (_local3);
};
_local3++;
};
return (-1);
}
public function get models():Array{
return (_models);
}
public function set ambient(_arg1:Array){
var _local2:int;
if (!_arg1){
return;
};
_local2 = _arg1.length;
if (_local2 < 1){
return;
};
_ambient[0] = _arg1[0];
if (_local2 < 2){
return;
};
_ambient[1] = _arg1[1];
if (_local2 < 3){
return;
};
_ambient[2] = _arg1[2];
}
public function getModel(_arg1:Model3D):int{
var _local2:int;
var _local3:int;
_local2 = _models.length;
_local3 = 0;
while (_local3 < _local2) {
if (_models[_local3] == _arg1){
return (_local3);
};
_local3++;
};
return (-1);
}
public function addLight(_arg1:Light3D):void{
if (getLight(_arg1) > -1){
return;
};
_lights.push(_arg1);
}
public function removeLight(_arg1:Light3D):void{
var _local2:int;
var _local3:int;
_local2 = _lights.length;
_local3 = 0;
while (_local3 < _local2) {
if (_lights[_local3] == _arg1){
removeLightAt(_local3);
return;
};
_local3++;
};
}
}
}//package pixels3d