From 75e6e791742da42742fd2ccb5e47b6dcbd5cc370 Mon Sep 17 00:00:00 2001 From: akadjoker Date: Tue, 25 Feb 2014 20:32:34 +0000 Subject: [PATCH] fix some bugs and rewrite the core --- README.md | 23 +- application.xml | 7 +- assets/desert.tmx | 1644 +- assets/map.tmx | 624 +- assets/sewers.tmx | 2608 +-- assets/texture.jpg | Bin 0 -> 43183 bytes bin/html5/bin/assets/Background.jpg | Bin 0 -> 158141 bytes bin/html5/bin/assets/desert.tmx | 1644 +- bin/html5/bin/assets/map.tmx | 624 +- bin/html5/bin/assets/sewers.tmx | 2608 +-- bin/html5/bin/assets/texture.jpg | Bin 0 -> 43183 bytes bin/html5/bin/glframework.js | 13348 ++++++++-------- bin/html5/bin/index.html | 2 +- bin/html5/haxe/ApplicationMain.hx | 14 + bin/html5/haxe/DefaultAssetLibrary.hx | 12 + bin/windows/neko/bin/assets/Background.jpg | Bin 0 -> 158141 bytes bin/windows/neko/bin/assets/desert.tmx | 1644 +- bin/windows/neko/bin/assets/map.tmx | 624 +- bin/windows/neko/bin/assets/sewers.tmx | 2608 +-- bin/windows/neko/bin/assets/texture.jpg | Bin 0 -> 43183 bytes bin/windows/neko/bin/glframework.exe | Bin 427239 -> 438056 bytes bin/windows/neko/bin/manifest | 2 +- bin/windows/neko/bin/rescale.png | Bin 0 -> 30529 bytes bin/windows/neko/haxe/ApplicationMain.hx | 13 +- bin/windows/neko/haxe/DefaultAssetLibrary.hx | 6 + bin/windows/neko/obj/ApplicationMain.n | Bin 420063 -> 430880 bytes src/com/djoker/glteste/FPS.hx | 1 + src/com/djoker/glteste/Main.hx | 10 +- src/com/djoker/glteste/TestTrasform.hx | 59 +- src/com/djoker/glteste/TesteAtlas.hx | 26 +- src/com/djoker/glteste/TesteBatch.hx | 58 +- src/com/djoker/glteste/TesteBatchTiles.hx | 276 +- src/com/djoker/glteste/TesteBitmap.hx | 4 +- src/com/djoker/glteste/TesteBlockTiles.hx | 219 + .../djoker/glteste/TesteBlockTilesCache.hx | 196 + src/com/djoker/glteste/TesteCloud.hx | 12 +- src/com/djoker/glteste/TesteCloudTiles.hx | 31 +- src/com/djoker/glteste/TestePrimitives.hx | 53 +- src/com/djoker/glteste/TesteTexRender.hx | 483 + src/com/djoker/glteste/TesteTiles.hx | 2 +- src/com/engine/game/Game.hx | 179 +- src/com/engine/game/Screen.hx | 12 +- src/com/engine/game/Transform.hx | 8 +- src/com/engine/input/Keys.hx | 107 + src/com/engine/math/Frustum.hx | 65 - src/com/engine/math/Matrix.hx | 768 - src/com/engine/math/Plane.hx | 118 - src/com/engine/math/Quaternion.hx | 190 - src/com/engine/math/Vector2.hx | 6 +- src/com/engine/math/Vector3.hx | 8 +- src/com/engine/misc/MatrixHelp.hx | 66 - src/com/engine/misc/Util.hx | 135 +- src/com/engine/render/BatchPrimitives.hx | 14 +- src/com/engine/render/BlendMode.hx | 15 +- src/com/engine/render/Block.hx | 131 + src/com/engine/render/Buffer.hx | 38 +- src/com/engine/render/Camera.hx | 48 +- src/com/engine/render/PrimitiveShader.hx | 41 +- src/com/engine/render/RenderTexture.hx | 73 + src/com/engine/render/SpriteAtlas.hx | 84 +- src/com/engine/render/SpriteBatch.hx | 72 +- src/com/engine/render/SpriteCloud.hx | 230 +- src/com/engine/render/SpriteShader.hx | 90 +- src/com/engine/render/Texture.hx | 145 +- src/com/engine/render/TileMap.hx | 523 +- src/com/engine/render/TileMapCache.hx | 532 + src/com/engine/render/VertexBuffer.hx | 5 +- src/com/engine/render/filter/BlurFilter.hx | 37 + src/com/engine/render/filter/BlurXFilter.hx | 37 + src/com/engine/render/filter/BlurYFilter.hx | 37 + .../engine/render/filter/ColorMatrixFilter.hx | 51 + .../engine/render/filter/ColorStepFilter.hx | 39 + .../engine/render/filter/CrossHatchFilter.hx | 38 + .../engine/render/filter/DotScreenFilter.hx | 49 + src/com/engine/render/filter/Filter.hx | 402 + src/com/engine/render/filter/GrayFilter.hx | 38 + src/com/engine/render/filter/InvertFilter.hx | 39 + src/com/engine/render/filter/NormalFilter.hx | 44 + .../engine/render/filter/PixelateFilter.hx | 42 + .../engine/render/filter/RGBSplitFilter.hx | 45 + src/com/engine/render/filter/RenderFilter.hx | 212 + src/com/engine/render/filter/SepiaFilter.hx | 38 + src/com/engine/render/filter/TwistFilter.hx | 60 + src/com/engine/render/tiles/Layer.hx | 228 + src/com/engine/render/tiles/LayerCache.hx | 270 + src/com/engine/{game => ui}/Text.hx | 5 +- 86 files changed, 12018 insertions(+), 22881 deletions(-) create mode 100755 assets/texture.jpg create mode 100755 bin/html5/bin/assets/Background.jpg create mode 100755 bin/html5/bin/assets/texture.jpg create mode 100755 bin/windows/neko/bin/assets/Background.jpg create mode 100755 bin/windows/neko/bin/assets/texture.jpg create mode 100755 bin/windows/neko/bin/rescale.png create mode 100755 src/com/djoker/glteste/TesteBlockTiles.hx create mode 100755 src/com/djoker/glteste/TesteBlockTilesCache.hx create mode 100755 src/com/djoker/glteste/TesteTexRender.hx create mode 100755 src/com/engine/input/Keys.hx delete mode 100755 src/com/engine/math/Frustum.hx delete mode 100755 src/com/engine/math/Matrix.hx delete mode 100755 src/com/engine/math/Plane.hx delete mode 100755 src/com/engine/math/Quaternion.hx delete mode 100755 src/com/engine/misc/MatrixHelp.hx create mode 100755 src/com/engine/render/Block.hx create mode 100755 src/com/engine/render/RenderTexture.hx create mode 100755 src/com/engine/render/TileMapCache.hx create mode 100755 src/com/engine/render/filter/BlurFilter.hx create mode 100755 src/com/engine/render/filter/BlurXFilter.hx create mode 100755 src/com/engine/render/filter/BlurYFilter.hx create mode 100755 src/com/engine/render/filter/ColorMatrixFilter.hx create mode 100755 src/com/engine/render/filter/ColorStepFilter.hx create mode 100755 src/com/engine/render/filter/CrossHatchFilter.hx create mode 100755 src/com/engine/render/filter/DotScreenFilter.hx create mode 100755 src/com/engine/render/filter/Filter.hx create mode 100755 src/com/engine/render/filter/GrayFilter.hx create mode 100755 src/com/engine/render/filter/InvertFilter.hx create mode 100755 src/com/engine/render/filter/NormalFilter.hx create mode 100755 src/com/engine/render/filter/PixelateFilter.hx create mode 100755 src/com/engine/render/filter/RGBSplitFilter.hx create mode 100755 src/com/engine/render/filter/RenderFilter.hx create mode 100755 src/com/engine/render/filter/SepiaFilter.hx create mode 100755 src/com/engine/render/filter/TwistFilter.hx create mode 100755 src/com/engine/render/tiles/Layer.hx create mode 100755 src/com/engine/render/tiles/LayerCache.hx rename src/com/engine/{game => ui}/Text.hx (71%) diff --git a/README.md b/README.md index e777b51..c58c144 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,19 @@ -glframework -=========== - -haxe opengl framework target Android, HTML5, Windows +TERMS OF USE - GLFRAMEWORK + +Open source under the BSD License. + +Copyright © 2014 Luis Santos AKA DJOKER +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +glframework +=========== + +haxe opengl framework target Android, HTML5, Windows diff --git a/application.xml b/application.xml index ba0e2dc..950440b 100755 --- a/application.xml +++ b/application.xml @@ -8,13 +8,14 @@ - - - + + + + diff --git a/assets/desert.tmx b/assets/desert.tmx index 7670483..de91ea9 100755 --- a/assets/desert.tmx +++ b/assets/desert.tmx @@ -26,1607 +26,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,14,15,16,30,31,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,25,26,27,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,33,34,35,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,22,23,24,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,41,42,43,30,1,30,30,30,30,30,30,30,30,30,30,30,30,30,30,1,2,3,30,30,31,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,40,30,30,30,30,33,34,36,42,37,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,38,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,48,38,30,30,30,30,33,34,44,26,45,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,40,30,30,30,40,30,30,30,33,34,34,34,34,34,34,34,36,42,37,34,35,9,10,11,30,30,30,30,10,30,10,30,30,30,30,30,30, +40,30,30,30,30,40,38,30,30,38,30,33,34,34,34,34,34,34,34,44,26,45,34,35,9,10,11,30,30,30,30,30,30,10,30,30,30,30,30,30, +30,39,30,30,30,38,30,40,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,39,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +7,7,8,1,2,2,2,2,2,2,2,2,3,1,2,2,2,2,2,2,2,2,2,2,29,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +15,15,16,9,10,10,10,10,10,10,10,10,11,9,10,10,10,10,10,10,10,10,10,10,10,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +23,23,24,17,18,18,18,18,18,18,18,18,19,17,18,18,18,18,18,18,18,18,18,18,18,18,19,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,31, +30,30,30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32, +39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,30,33,34,34,34,34,34,34,34,34,36,42,37,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,39,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,44,26,45,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,48, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30,31,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30 + diff --git a/assets/map.tmx b/assets/map.tmx index 121b3c2..f74954a 100755 --- a/assets/map.tmx +++ b/assets/map.tmx @@ -4,607 +4,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +14,2,2,2,2,13,6,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,13, +5,0,0,0,0,7,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,19,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,10,10,10,10,10,10,10,10,16,0,0,15,10,10,10,10,17, +5,0,0,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,5,0,0,7,6,6,6,6,6, +5,0,0,0,0,0,0,0,0,0,0,15,17,6,14,2,2,2,2,2,2,20,0,0,19,2,2,2,2,13, +5,0,0,0,0,15,10,16,0,0,15,17,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,7,6,5,0,15,17,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +18,10,10,10,10,17,6,18,10,17,6,6,6,6,5,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,18,10,16,0,0,0,15,10,10,10,10,16,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,0,0,0,7,6,6,6,6,5,0,0,0,7, +6,6,6,6,6,14,2,2,2,2,2,2,2,2,2,2,20,0,0,0,19,2,2,2,2,20,0,0,0,7, +6,6,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +14,2,2,2,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,15,16,0,0,15,16,0,0,0,15,10,10,10,17, +5,0,0,0,0,0,0,0,15,16,0,0,19,20,0,0,19,20,0,0,7,5,0,0,8,7,6,6,6,6, +5,0,0,0,0,0,0,0,7,5,0,0,0,0,0,0,0,0,0,0,7,18,10,10,10,17,6,6,6,6, +5,0,0,0,15,16,0,0,7,18,16,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,6, +18,10,10,10,17,18,10,10,17,6,18,10,10,10,10,10,10,10,10,10,17,6,6,6,6,6,6,6,6,6 + diff --git a/assets/sewers.tmx b/assets/sewers.tmx index baf33c5..869e0b4 100755 --- a/assets/sewers.tmx +++ b/assets/sewers.tmx @@ -9,2507 +9,111 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,36,42,37,37,42,38,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,9,10,11,34,35,28,28,33,12,13,14,35,28,28,28,28,33,20,2,2,2,2,2,2,2,2,2,2,2,2,2,22,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,17,18,19,34,35,28,28,33,12,13,14,35,28,28,28,28,33,9,10,10,10,10,10,10,39,10,10,10,10,10,10,11,34,36,42,43,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,33,17,18,18,18,18,40,18,18,18,18,18,18,18,18,19,34,35,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +2,22,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +10,11,34,34,9,10,11,34,35,28,28,33,20,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +18,19,34,34,17,18,19,34,35,28,28,33,9,10,11,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +34,34,34,34,34,34,34,34,35,28,28,33,17,70,19,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +42,42,42,42,42,42,42,42,43,28,28,41,42,42,42,43,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,25,26,26,26,26,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,34,34,34,34,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,12,13,13,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,20,2,2,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,9,10,10,10,11,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,17,70,18,70,19,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,41,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,34,34,34,28,28,34,34,34,34,34,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,58,59,59,59,59,59,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + diff --git a/assets/texture.jpg b/assets/texture.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8bc4246d5a5169a578689d7fb6e49accb3206399 GIT binary patch literal 43183 zcma%iXH*kT@L(DVH6-*<1B70rgf0-I_fVySp(7woP(dJo5_(5KkkA8&N^hd{qM&r8 zcLaZeA}XMO=l|Z_eZJYZZ}-i--JK7!Q+NM<{JRc780i`60e~O?z~f&7{QUwz>fCm} zc^3c#KmY*1)qki%09?!C7QqwX(fbbr{JR8506-xS2o(fMMFpjS{_AwqP$)GWJuNLA zEiFBQ{(l349?pnhgwr!Kv#>BTb8~TVar6B@0K#A}26_e#1cHN;70Jr^{|NuTlfS(H zBsB;C0)T-?00;>LBY}Sh0qOtvqXGhf|M>hr00x2}R8Rnn`XBax;Q!+PjX)3>LWKYT z!5}IS1OkRqLBRj$KmZcN50=$pf>2oq+z6I~60@!`mo@fHZCDDjz`h+32gxW#YgqBxhLWdvPlk##SlIJT;dNt2!$FO{Zp}1qp{2sqMv*qZoDIlZJdl z!csd<2(=EU1F#`0uPFBqtT2xIYGzQ%AhQV#uP6@+dL>;8T<#$rJRXKyAK*qvkUlNB z4zZN0Ka^Ep+hU={=xjaXU+NOtftJtll1E;58BRd|gm zJ9-IZd4WhZk4SF{(kX~WVEHOPh-kT+ar7P6rR@dv1mSYn{i4#Y;=^>XH_<@uzH@|f zOToIXwi{lI1D+SglS3djNe;z|stT81i`_)X9|E+}0VUdXaJjozjWz6M$|3S9#>Q;8 zhqw6f1AJ3po=Sra|(jU`%OT2Qh-2_vsElo^~QGNYA|Oy!-?IMzx69eARJTN?gO0-(Ii2F{-zvYK0QJ(A=D={300oUlW0R^1=?x0F zql|4LwOk6=(!TMmyo9U_LGQCgcS0B@y>zOWDX^p?+_$OTJEd6qB+Q%2#sMsxZA*Gf zpM$$@j~fTq*3gA%FycRw4fA{3lhhcE!M%pnwD#3aXpOq8F_Xf?6tw@;r;}hB5vo?~OLcFT!E$^#W?v z1u~PS#=G&v%vgBTRSPG2qR^rNn=t?8$OK3^W$?NZ?ns`E-guoDsYAKC07LAomLL>$ z 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 KPwX^BfB)II2+2bL literal 0 HcmV?d00001 diff --git a/bin/html5/bin/assets/Background.jpg b/bin/html5/bin/assets/Background.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e0494383ca993baf107d2b175ae7fa9e166496a5 GIT binary patch literal 158141 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

O&j-5oe`de7cfhx8FMq5xUs0W-P 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 PWhwM9>gBIL`gh=efdE8@ literal 0 HcmV?d00001 diff --git a/bin/html5/bin/assets/desert.tmx b/bin/html5/bin/assets/desert.tmx index 7670483..de91ea9 100755 --- a/bin/html5/bin/assets/desert.tmx +++ b/bin/html5/bin/assets/desert.tmx @@ -26,1607 +26,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,14,15,16,30,31,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,25,26,27,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,33,34,35,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,22,23,24,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,41,42,43,30,1,30,30,30,30,30,30,30,30,30,30,30,30,30,30,1,2,3,30,30,31,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,40,30,30,30,30,33,34,36,42,37,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,38,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,48,38,30,30,30,30,33,34,44,26,45,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,40,30,30,30,40,30,30,30,33,34,34,34,34,34,34,34,36,42,37,34,35,9,10,11,30,30,30,30,10,30,10,30,30,30,30,30,30, +40,30,30,30,30,40,38,30,30,38,30,33,34,34,34,34,34,34,34,44,26,45,34,35,9,10,11,30,30,30,30,30,30,10,30,30,30,30,30,30, +30,39,30,30,30,38,30,40,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,39,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +7,7,8,1,2,2,2,2,2,2,2,2,3,1,2,2,2,2,2,2,2,2,2,2,29,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +15,15,16,9,10,10,10,10,10,10,10,10,11,9,10,10,10,10,10,10,10,10,10,10,10,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +23,23,24,17,18,18,18,18,18,18,18,18,19,17,18,18,18,18,18,18,18,18,18,18,18,18,19,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,31, +30,30,30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32, +39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,30,33,34,34,34,34,34,34,34,34,36,42,37,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,39,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,44,26,45,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,48, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30,31,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30 + diff --git a/bin/html5/bin/assets/map.tmx b/bin/html5/bin/assets/map.tmx index 121b3c2..f74954a 100755 --- a/bin/html5/bin/assets/map.tmx +++ b/bin/html5/bin/assets/map.tmx @@ -4,607 +4,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +14,2,2,2,2,13,6,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,13, +5,0,0,0,0,7,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,19,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,10,10,10,10,10,10,10,10,16,0,0,15,10,10,10,10,17, +5,0,0,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,5,0,0,7,6,6,6,6,6, +5,0,0,0,0,0,0,0,0,0,0,15,17,6,14,2,2,2,2,2,2,20,0,0,19,2,2,2,2,13, +5,0,0,0,0,15,10,16,0,0,15,17,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,7,6,5,0,15,17,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +18,10,10,10,10,17,6,18,10,17,6,6,6,6,5,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,18,10,16,0,0,0,15,10,10,10,10,16,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,0,0,0,7,6,6,6,6,5,0,0,0,7, +6,6,6,6,6,14,2,2,2,2,2,2,2,2,2,2,20,0,0,0,19,2,2,2,2,20,0,0,0,7, +6,6,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +14,2,2,2,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,15,16,0,0,15,16,0,0,0,15,10,10,10,17, +5,0,0,0,0,0,0,0,15,16,0,0,19,20,0,0,19,20,0,0,7,5,0,0,8,7,6,6,6,6, +5,0,0,0,0,0,0,0,7,5,0,0,0,0,0,0,0,0,0,0,7,18,10,10,10,17,6,6,6,6, +5,0,0,0,15,16,0,0,7,18,16,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,6, +18,10,10,10,17,18,10,10,17,6,18,10,10,10,10,10,10,10,10,10,17,6,6,6,6,6,6,6,6,6 + diff --git a/bin/html5/bin/assets/sewers.tmx b/bin/html5/bin/assets/sewers.tmx index baf33c5..869e0b4 100755 --- a/bin/html5/bin/assets/sewers.tmx +++ b/bin/html5/bin/assets/sewers.tmx @@ -9,2507 +9,111 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,36,42,37,37,42,38,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,9,10,11,34,35,28,28,33,12,13,14,35,28,28,28,28,33,20,2,2,2,2,2,2,2,2,2,2,2,2,2,22,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,17,18,19,34,35,28,28,33,12,13,14,35,28,28,28,28,33,9,10,10,10,10,10,10,39,10,10,10,10,10,10,11,34,36,42,43,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,33,17,18,18,18,18,40,18,18,18,18,18,18,18,18,19,34,35,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +2,22,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +10,11,34,34,9,10,11,34,35,28,28,33,20,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +18,19,34,34,17,18,19,34,35,28,28,33,9,10,11,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +34,34,34,34,34,34,34,34,35,28,28,33,17,70,19,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +42,42,42,42,42,42,42,42,43,28,28,41,42,42,42,43,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,25,26,26,26,26,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,34,34,34,34,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,12,13,13,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,20,2,2,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,9,10,10,10,11,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,17,70,18,70,19,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,41,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,34,34,34,28,28,34,34,34,34,34,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,58,59,59,59,59,59,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + diff --git a/bin/html5/bin/assets/texture.jpg b/bin/html5/bin/assets/texture.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8bc4246d5a5169a578689d7fb6e49accb3206399 GIT binary patch literal 43183 zcma%iXH*kT@L(DVH6-*<1B70rgf0-I_fVySp(7woP(dJo5_(5KkkA8&N^hd{qM&r8 zcLaZeA}XMO=l|Z_eZJYZZ}-i--JK7!Q+NM<{JRc780i`60e~O?z~f&7{QUwz>fCm} zc^3c#KmY*1)qki%09?!C7QqwX(fbbr{JR8506-xS2o(fMMFpjS{_AwqP$)GWJuNLA zEiFBQ{(l349?pnhgwr!Kv#>BTb8~TVar6B@0K#A}26_e#1cHN;70Jr^{|NuTlfS(H zBsB;C0)T-?00;>LBY}Sh0qOtvqXGhf|M>hr00x2}R8Rnn`XBax;Q!+PjX)3>LWKYT z!5}IS1OkRqLBRj$KmZcN50=$pf>2oq+z6I~60@!`mo@fHZCDDjz`h+32gxW#YgqBxhLWdvPlk##SlIJT;dNt2!$FO{Zp}1qp{2sqMv*qZoDIlZJdl z!csd<2(=EU1F#`0uPFBqtT2xIYGzQ%AhQV#uP6@+dL>;8T<#$rJRXKyAK*qvkUlNB z4zZN0Ka^Ep+hU={=xjaXU+NOtftJtll1E;58BRd|gm zJ9-IZd4WhZk4SF{(kX~WVEHOPh-kT+ar7P6rR@dv1mSYn{i4#Y;=^>XH_<@uzH@|f zOToIXwi{lI1D+SglS3djNe;z|stT81i`_)X9|E+}0VUdXaJjozjWz6M$|3S9#>Q;8 zhqw6f1AJ3po=Sra|(jU`%OT2Qh-2_vsElo^~QGNYA|Oy!-?IMzx69eARJTN?gO0-(Ii2F{-zvYK0QJ(A=D={300oUlW0R^1=?x0F zql|4LwOk6=(!TMmyo9U_LGQCgcS0B@y>zOWDX^p?+_$OTJEd6qB+Q%2#sMsxZA*Gf zpM$$@j~fTq*3gA%FycRw4fA{3lhhcE!M%pnwD#3aXpOq8F_Xf?6tw@;r;}hB5vo?~OLcFT!E$^#W?v z1u~PS#=G&v%vgBTRSPG2qR^rNn=t?8$OK3^W$?NZ?ns`E-guoDsYAKC07LAomLL>$ z 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 KPwX^BfB)II2+2bL literal 0 HcmV?d00001 diff --git a/bin/html5/bin/glframework.js b/bin/html5/bin/glframework.js index 8b5abe6..d781ed9 100755 --- a/bin/html5/bin/glframework.js +++ b/bin/html5/bin/glframework.js @@ -23,12 +23,15 @@ ApplicationMain.main = function() { ApplicationMain.preloader = new NMEPreloader(); flash.Lib.get_current().addChild(ApplicationMain.preloader); ApplicationMain.preloader.onInit(); + var loader = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/Background.jpg",loader); + ApplicationMain.total++; var urlLoader = new flash.net.URLLoader(); urlLoader.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); ApplicationMain.urlLoaders.set("assets/desert.tmx",urlLoader); ApplicationMain.total++; - var loader = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/hxlogo.png",loader); + var loader1 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/hxlogo.png",loader1); ApplicationMain.total++; var urlLoader1 = new flash.net.URLLoader(); urlLoader1.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); @@ -38,8 +41,8 @@ ApplicationMain.main = function() { urlLoader2.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); ApplicationMain.urlLoaders.set("assets/mapxml.tmx",urlLoader2); ApplicationMain.total++; - var loader1 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/player.png",loader1); + var loader2 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/player.png",loader2); ApplicationMain.total++; var urlLoader3 = new flash.net.URLLoader(); urlLoader3.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); @@ -49,27 +52,30 @@ ApplicationMain.main = function() { urlLoader4.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); ApplicationMain.urlLoaders.set("assets/sewers.tmx",urlLoader4); ApplicationMain.total++; - var loader2 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/sewer_tileset.png",loader2); - ApplicationMain.total++; var loader3 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/sprites.png",loader3); + ApplicationMain.loaders.set("assets/sewer_tileset.png",loader3); ApplicationMain.total++; var loader4 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/texture.png",loader4); + ApplicationMain.loaders.set("assets/sprites.png",loader4); + ApplicationMain.total++; + var loader5 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/texture.jpg",loader5); + ApplicationMain.total++; + var loader6 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/texture.png",loader6); ApplicationMain.total++; var urlLoader5 = new flash.net.URLLoader(); urlLoader5.set_dataFormat(flash.net.URLLoaderDataFormat.BINARY); ApplicationMain.urlLoaders.set("assets/TileMap.tmx",urlLoader5); ApplicationMain.total++; - var loader5 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/tiles.png",loader5); + var loader7 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/tiles.png",loader7); ApplicationMain.total++; - var loader6 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/tmw_desert_spacing.png",loader6); + var loader8 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/tmw_desert_spacing.png",loader8); ApplicationMain.total++; - var loader7 = new flash.display.Loader(); - ApplicationMain.loaders.set("assets/zazaka.png",loader7); + var loader9 = new flash.display.Loader(); + ApplicationMain.loaders.set("assets/zazaka.png",loader9); ApplicationMain.total++; var resourcePrefix = "__ASSET__:bitmap_"; var _g = 0, _g1 = haxe.Resource.listNames(); @@ -88,9 +94,9 @@ ApplicationMain.main = function() { var $it0 = ApplicationMain.loaders.keys(); while( $it0.hasNext() ) { var path = $it0.next(); - var loader8 = ApplicationMain.loaders.get(path); - loader8.contentLoaderInfo.addEventListener("complete",ApplicationMain.loader_onComplete); - loader8.load(new flash.net.URLRequest(path)); + var loader10 = ApplicationMain.loaders.get(path); + loader10.contentLoaderInfo.addEventListener("complete",ApplicationMain.loader_onComplete); + loader10.load(new flash.net.URLRequest(path)); } var $it1 = ApplicationMain.urlLoaders.keys(); while( $it1.hasNext() ) { @@ -926,15 +932,18 @@ com.engine.game.Game = function() { this.screenWidth = 0; this.screen = null; openfl.display.OpenGLView.call(this); + com.engine.game.Game.game = this; this.ready = false; this.set_render($bind(this,this.renderView)); this.screenWidth = flash.Lib.get_current().get_stage().get_stageWidth(); this.screenHeight = flash.Lib.get_current().get_stage().get_stageHeight(); - com.engine.game.Game.viewWidth = this.screenHeight; + this.requestedFramerate = flash.Lib.get_current().get_stage().get_frameRate() | 0; + com.engine.game.Game.viewWidth = this.screenWidth; com.engine.game.Game.viewHeight = this.screenHeight; this.gameWidth = this.screenWidth; this.gameHeight = this.screenHeight; - com.engine.game.Game.projMatrix = com.engine.math.Matrix.OrthoOffCenterLH(0,this.gameWidth,this.gameHeight,0,-1,1); + com.engine.game.Game.camera = new com.engine.render.Camera(this.screenWidth,this.screenHeight); + this.textures = new haxe.ds.StringMap(); this.get_stage().addEventListener(flash.events.Event.RESIZE,$bind(this,this.onResize)); this.get_stage().addEventListener(flash.events.Event.ADDED,$bind(this,this.focusGained)); this.get_stage().addEventListener(flash.events.Event.DEACTIVATE,$bind(this,this.focusLost)); @@ -948,7 +957,33 @@ $hxClasses["com.engine.game.Game"] = com.engine.game.Game; com.engine.game.Game.__name__ = ["com","engine","game","Game"]; com.engine.game.Game.__super__ = openfl.display.OpenGLView; com.engine.game.Game.prototype = $extend(openfl.display.OpenGLView.prototype,{ - renderView: function(rect) { + getTimer: function() { + return flash.Lib.getTimer(); + } + ,updateTimer: function() { + com.engine.game.Game.then = com.engine.game.Game.now; + com.engine.game.Game.now = this.getTimer(); + com.engine.game.Game.dt = com.engine.game.Game.then == 0?0:(com.engine.game.Game.now - com.engine.game.Game.then) / 1000; + if(com.engine.game.Game.fixedTimestep) com.engine.game.Game.dt = 1 / this.requestedFramerate; + com.engine.game.Game.frames++; + if(com.engine.game.Game.now - com.engine.game.Game.frameStart >= 1000) { + com.engine.game.Game.fps = Math.min(this.requestedFramerate,com.engine.game.Game.frames) | 0; + com.engine.game.Game.frames = 0; + com.engine.game.Game.frameStart = com.engine.game.Game.now; + } + } + ,getTexture: function(url,flip) { + if(flip == null) flip = false; + if(this.textures.exists(url)) return this.textures.get(url); else { + var tex = new com.engine.render.Texture(); + tex.load(url,flip); + this.textures.set(url,tex); + return tex; + } + } + ,renderView: function(rect) { + this.updateTimer(); + var timer = this.getTimer(); com.engine.game.Game.viewWidth = rect.width | 0; com.engine.game.Game.viewHeight = rect.height | 0; if(this.rescale == true) { @@ -960,21 +995,29 @@ com.engine.game.Game.prototype = $extend(openfl.display.OpenGLView.prototype,{ var margin_x = (this.screenWidth - this.gameWidth * scale_w) / 2; var margin_y = (this.screenHeight - this.gameHeight * scale_h) / 2; openfl.gl.GL.viewport(margin_x | 0,margin_y | 0,this.gameWidth * scale_w | 0,this.gameHeight * scale_h | 0); - com.engine.game.Game.projMatrix = com.engine.math.Matrix.OrthoOffCenterLH(0,this.gameWidth / ar_origin,this.gameHeight / ar_origin,0,-1000,1000); + if(com.engine.game.Game.camera != null) com.engine.game.Game.camera.resize(this.gameWidth / ar_origin,this.gameHeight / ar_origin); } else { openfl.gl.GL.viewport(rect.x | 0,rect.y | 0,rect.width | 0,rect.height | 0); - com.engine.game.Game.projMatrix = com.engine.math.Matrix.OrthoOffCenterLH(0,this.gameWidth,this.gameHeight,0,-1,1); + if(com.engine.game.Game.camera != null) com.engine.game.Game.camera.resize(com.engine.game.Game.viewWidth,com.engine.game.Game.viewHeight); } + if(com.engine.game.Game.camera != null) com.engine.game.Game.camera.update(); this.nextFrame = flash.Lib.getTimer(); this.deltaTime = (this.nextFrame - this.prevFrame) * 0.001; openfl.gl.GL.clearColor(this.red,this.green,this.blue,1); if(this.enableDepth == true) openfl.gl.GL.clear(16640); else openfl.gl.GL.clear(16384); - if(this.ready) this.update(this.deltaTime); + if(this.ready) this.onRender(); + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.vertexAttribute); + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.texCoordAttribute); + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.colorAttribute); openfl.gl.GL.bindBuffer(34962,null); openfl.gl.GL.useProgram(null); openfl.gl.GL.blendFunc(770,772); + timer = this.getTimer(); this.prevFrame = this.nextFrame; } + ,onEnterFrame: function(event) { + this.onUpdate(com.engine.game.Game.dt); + } ,setScreen: function(screen) { if(this.screen != null) this.screen.dispose(); this.screen = screen; @@ -996,8 +1039,11 @@ com.engine.game.Game.prototype = $extend(openfl.display.OpenGLView.prototype,{ } ,keyDown: function(key) { } - ,update: function(dt) { - if(this.screen != null) this.screen.render(dt); + ,onRender: function() { + if(this.screen != null) this.screen.update(com.engine.game.Game.dt); + if(this.screen != null) this.screen.render(); + } + ,onUpdate: function(dt) { } ,resize: function(width,height) { if(this.screen != null) this.screen.resize(width,height); @@ -1012,9 +1058,18 @@ com.engine.game.Game.prototype = $extend(openfl.display.OpenGLView.prototype,{ this.resize(this.screenWidth,this.screenHeight); } ,focusLost: function(e) { - console.log("end game"); this.ready = false; this.end(); + var $it0 = ((function(_e) { + return function() { + return _e.iterator(); + }; + })(this.textures))(); + while( $it0.hasNext() ) { + var tex = $it0.next(); + tex.dispose(); + } + this.textures = null; } ,doTouchMove: function(event) { } @@ -1062,9 +1117,11 @@ com.engine.game.Game.prototype = $extend(openfl.display.OpenGLView.prototype,{ openfl.gl.GL.blendFunc(770,772); openfl.gl.GL.pixelStorei(3333,2); this.setDeph(true); - this.clarColor(0,1,0.4); + this.clarColor(0,0,0.4); openfl.gl.GL.clearColor(this.red,this.green,this.blue,1); openfl.gl.GL.depthMask(true); + openfl.gl.GL.colorMask(true,true,true,true); + openfl.gl.GL.activeTexture(33984); this.begin(); this.ready = true; } @@ -1103,7 +1160,7 @@ com.djoker.glteste.Main.__name__ = ["com","djoker","glteste","Main"]; com.djoker.glteste.Main.__super__ = com.engine.game.Game; com.djoker.glteste.Main.prototype = $extend(com.engine.game.Game.prototype,{ begin: function() { - this.setScreen(new com.djoker.glteste.TestTrasform()); + this.setScreen(new com.djoker.glteste.TesteTexRender()); } ,__class__: com.djoker.glteste.Main }); @@ -1176,6 +1233,9 @@ openfl.AssetLibrary.prototype = { } var DefaultAssetLibrary = function() { openfl.AssetLibrary.call(this); + DefaultAssetLibrary.path.set("assets/Background.jpg","assets/Background.jpg"); + var value = Reflect.field(openfl.AssetType,"image".toUpperCase()); + DefaultAssetLibrary.type.set("assets/Background.jpg",value); DefaultAssetLibrary.path.set("assets/desert.tmx","assets/desert.tmx"); var value = Reflect.field(openfl.AssetType,"binary".toUpperCase()); DefaultAssetLibrary.type.set("assets/desert.tmx",value); @@ -1203,6 +1263,9 @@ var DefaultAssetLibrary = function() { DefaultAssetLibrary.path.set("assets/sprites.png","assets/sprites.png"); var value = Reflect.field(openfl.AssetType,"image".toUpperCase()); DefaultAssetLibrary.type.set("assets/sprites.png",value); + DefaultAssetLibrary.path.set("assets/texture.jpg","assets/texture.jpg"); + var value = Reflect.field(openfl.AssetType,"image".toUpperCase()); + DefaultAssetLibrary.type.set("assets/texture.jpg",value); DefaultAssetLibrary.path.set("assets/texture.png","assets/texture.png"); var value = Reflect.field(openfl.AssetType,"image".toUpperCase()); DefaultAssetLibrary.type.set("assets/texture.png",value); @@ -2082,12 +2145,12 @@ com.engine.game.Transform.prototype = { } ,getTransformationMatrix: function() { this.mTransformationMatrix.identity(); - var cx = com.engine.game.Game.scrollX; - var cy = com.engine.game.Game.scrollY; + var cx = com.engine.game.Game.camera.scrollX; + var cy = com.engine.game.Game.camera.scrollY; var sx = this.x - cx * this.scrollFactorX; var sy = this.y - cy * this.scrollFactorY; if(this.scaleX != 1.0 || this.scaleY != 1.0) this.mTransformationMatrix.scale(this.scaleX,this.scaleY); - if(this.skewX != 0.0 || this.skewY != 0.0) com.engine.misc.MatrixHelp.skew(this.mTransformationMatrix,this.skewX,this.skewY); + if(this.skewX != 0.0 || this.skewY != 0.0) com.engine.misc.Util.skew(this.mTransformationMatrix,this.skewX,this.skewY); if(this.rotation != 0.0) this.mTransformationMatrix.rotate(this.rotation); if(sx != 0.0 || sy != 0.0) this.mTransformationMatrix.translate(sx,sy); if(this.pivotX != 0.0 || this.pivotY != 0.0) { @@ -2129,7 +2192,11 @@ $hxClasses["com.engine.game.Screen"] = com.engine.game.Screen; com.engine.game.Screen.__name__ = ["com","engine","game","Screen"]; com.engine.game.Screen.__super__ = com.engine.game.GameObject; com.engine.game.Screen.prototype = $extend(com.engine.game.GameObject.prototype,{ - keyUp: function(key) { + getTexture: function(url,flip) { + if(flip == null) flip = false; + return this.game.getTexture(url,flip); + } + ,keyUp: function(key) { } ,keyDown: function(key) { } @@ -2141,57 +2208,251 @@ com.engine.game.Screen.prototype = $extend(com.engine.game.GameObject.prototype, } ,resize: function(width,height) { } - ,render: function(dt) { + ,update: function(dt) { + } + ,render: function() { } ,show: function() { } ,__class__: com.engine.game.Screen }); -com.djoker.glteste.TestTrasform = function() { +com.djoker.glteste.TesteTexRender = function() { this.skew = 0; + this.value = 0; + this.redy = false; + this.filterIndex = 0; com.engine.game.Screen.call(this); }; -$hxClasses["com.djoker.glteste.TestTrasform"] = com.djoker.glteste.TestTrasform; -com.djoker.glteste.TestTrasform.__name__ = ["com","djoker","glteste","TestTrasform"]; -com.djoker.glteste.TestTrasform.__super__ = com.engine.game.Screen; -com.djoker.glteste.TestTrasform.prototype = $extend(com.engine.game.Screen.prototype,{ +$hxClasses["com.djoker.glteste.TesteTexRender"] = com.djoker.glteste.TesteTexRender; +com.djoker.glteste.TesteTexRender.__name__ = ["com","djoker","glteste","TesteTexRender"]; +com.djoker.glteste.TesteTexRender.__super__ = com.engine.game.Screen; +com.djoker.glteste.TesteTexRender.prototype = $extend(com.engine.game.Screen.prototype,{ mouseDown: function(mousex,mousey) { - this.player.x = mousex; - this.player.y = mousey; - } - ,render: function(dt) { - this.player.rotation += dt * 2.1; - this.child.rotation -= dt * 2.5; - this.player.skewX += dt * 0.1; - this.skew += dt; - this.logo.skewX = Math.sin(this.skew); - this.logo.skewY = Math.cos(this.skew); + } + ,render: function() { + this.renderToFilter(this.filterIndex); + } + ,normalRender: function() { this.batch.Begin(); + this.batch.drawEntity(this.back); this.batch.drawEntity(this.logo); - this.batch.drawEntity(this.player); - this.batch.drawEntity(this.child); + this.batch.drawEntity(this.player,true); this.batch.End(); + this.primitives.begin(); + this.primitives.line(10,10,100,100,1,0,1); + this.primitives.rect(100,100,90,120,1,1,1); + this.primitives.circle(100,100,12,8,1,1,1,1); + this.primitives.ellipse(300,90,55,15,8,1,1,1,1); + this.primitives.fillrect(200,200,50,50,1,0,0,1); + this.primitives.fillrect(280,200,50,50,0,1,1,1); + this.primitives.fillcircle(200,100,8,18,1,0,1,1); + this.primitives.fillellipse(300,100,55,15,8,0,1,1,1); + this.primitives.end(); + } + ,keyUp: function(key) { + this.redy = false; + if(key == 39) this.filterIndex++; else if(key == 37) this.filterIndex--; + if(this.filterIndex <= 0) this.filterIndex = 0; + if(this.filterIndex >= 13) this.filterIndex = 13; + this.value = 1; + this.setFilter(this.filterIndex); + } + ,renderToFilter: function(index) { + if(!this.redy) return; + switch(index) { + case 1: + this.value += this.game.deltaTime * 0.1; + if(this.value > 10) this.value = 0.5; + var dataFilter = js.Boot.__cast(this.filter , com.engine.render.filter.ColorStepFilter); + dataFilter.setStep(this.value); + break; + case 3: + this.value += this.game.deltaTime * 0.1; + if(this.value > 1) this.value = 0.0; + var dataFilter = js.Boot.__cast(this.filter , com.engine.render.filter.InvertFilter); + dataFilter.setInvert(this.value); + break; + case 6: + this.value += this.game.deltaTime * 1.1; + if(this.value > 5) this.value = -1; + var dataFilter = js.Boot.__cast(this.filter , com.engine.render.filter.TwistFilter); + dataFilter.setRadius(this.value); + break; + case 13: + this.value += this.game.deltaTime * 1.1; + if(this.value > 100) this.value = 0; + var dataFilter = js.Boot.__cast(this.filter , com.engine.render.filter.ColorMatrixFilter); + dataFilter.setTransformation(Math.sin(this.value),Math.cos(this.value),this.value,1); + break; + } + if(this.filter != null) { + this.filter.begin(); + this.normalRender(); + this.filter.end(); + this.filter.render(); + } + } + ,setFilter: function(index) { + switch(index) { + case 0: + this.caption.set_text("Render Normal Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.NormalFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.NormalFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 1: + this.value = 4.5; + this.caption.set_text("Render Color Step Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.ColorStepFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.ColorStepFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 2: + this.caption.set_text("Render Gray Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.GrayFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.GrayFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 3: + this.value = 0.8; + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.InvertFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.InvertFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 4: + this.caption.set_text("Render Blur X Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.BlurXFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.BlurXFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 5: + this.caption.set_text("Render Blur Y Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.BlurYFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.BlurYFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 6: + this.value = 0.5; + this.caption.set_text("Render Twist Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.TwistFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.TwistFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 7: + this.caption.set_text("Render Sepia Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.SepiaFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.SepiaFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 8: + this.caption.set_text("Render Blur Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.BlurFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.BlurFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 9: + this.caption.set_text("Render Pixelate Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.PixelateFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.PixelateFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 10: + this.value = 0; + this.caption.set_text("Render Dot Screen Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.DotScreenFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.DotScreenFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 11: + this.value = 0; + this.caption.set_text("Render Split RGB Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.RGBSplitFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.RGBSplitFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 12: + this.value = 0; + this.caption.set_text("Render Cross hatch Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.CrossHatchFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.CrossHatchFilter(this.game.screenWidth,this.game.screenHeight); + break; + case 13: + this.value = 0; + this.caption.set_text("Render Color Matrix Transformation Filter"); + if(this.filter != null) { + this.filter.dispose(); + this.filter = null; + this.filter = new com.engine.render.filter.ColorMatrixFilter(this.game.screenWidth,this.game.screenHeight); + } else this.filter = new com.engine.render.filter.ColorMatrixFilter(this.game.screenWidth,this.game.screenHeight); + break; + } + this.redy = true; + } + ,update: function(dt) { + this.player.rotation += this.game.deltaTime * 2.1; + this.child.rotation -= this.game.deltaTime * 2.5; + this.player.skewX += this.game.deltaTime * 0.1; + this.skew += this.game.deltaTime; + this.logo.skewX = Math.sin(this.skew); + this.logo.skewY = Math.cos(this.skew); } ,show: function() { - this.playerTex = new com.engine.render.Texture("assets/zazaka.png",true); - this.batch = new com.engine.render.SpriteBatch(500); - var caption = new flash.text.TextField(); - caption.set_x(this.game.gameWidth / 2 - 100); - caption.set_y(20); - caption.set_width(200); - caption.set_defaultTextFormat(new flash.text.TextFormat("_sans",12,16776960)); - caption.set_text("Test trasform sprites by parent "); - caption.selectable = false; - this.game.addChild(caption); - this.logo = new com.engine.game.Entity(this.width / 2,this.height / 2,new com.engine.render.Texture("assets/hxlogo.png",true)); - this.logo.blendMode = com.engine.render.BlendMode.SCREEN; - this.player = new com.engine.game.Entity(300,200,this.playerTex); - this.child = new com.engine.game.Entity(0,0,this.playerTex); + this.batch = new com.engine.render.SpriteBatch(1000); + this.caption = new flash.text.TextField(); + this.caption.set_x(this.game.gameWidth / 2 - 100); + this.caption.set_y(20); + this.caption.set_width(200); + this.caption.set_defaultTextFormat(new flash.text.TextFormat("_sans",12,16776960)); + this.caption.set_text("Render Filter"); + this.caption.selectable = false; + this.game.addChild(this.caption); + var label = new flash.text.TextField(); + label.set_x(5); + label.set_y(this.game.gameHeight - 25); + label.set_width(400); + label.set_defaultTextFormat(new flash.text.TextFormat("_sans",22,16776960)); + label.set_text("Left/Right keys switch filters"); + label.selectable = false; + this.game.addChild(label); + this.player = new com.engine.game.Entity(300,300,this.getTexture("assets/zazaka.png",true)); + this.child = new com.engine.game.Entity(0,0,this.getTexture("assets/zazaka.png",true)); this.child.blue = 0; this.player.add(this.child); + this.logo = new com.engine.game.Entity(100 + this.width / 2,this.height / 2,this.getTexture("assets/hxlogo.png",true)); + this.back = new com.engine.game.Entity(256.,256.,this.getTexture("assets/texture.jpg",true)); + this.primitives = new com.engine.render.BatchPrimitives(500); + this.filterIndex = 0; + this.setFilter(this.filterIndex); this.game.clarColor(0,0,0); } - ,__class__: com.djoker.glteste.TestTrasform + ,__class__: com.djoker.glteste.TesteTexRender }); com.engine.game.Entity = function(x,y,image,name) { if(name == null) name = "solid"; @@ -2218,902 +2479,11 @@ com.engine.game.Entity.__super__ = com.engine.game.GameObject; com.engine.game.Entity.prototype = $extend(com.engine.game.GameObject.prototype,{ __class__: com.engine.game.Entity }); +com.engine.input = {} +com.engine.input.Keys = function() { } +$hxClasses["com.engine.input.Keys"] = com.engine.input.Keys; +com.engine.input.Keys.__name__ = ["com","engine","input","Keys"]; com.engine.math = {} -com.engine.math.Matrix = function() { - this.m = []; -}; -$hxClasses["com.engine.math.Matrix"] = com.engine.math.Matrix; -com.engine.math.Matrix.__name__ = ["com","engine","math","Matrix"]; -com.engine.math.Matrix.MatrixMultiply4x4 = function(A,B) { - var result = new com.engine.math.Matrix(); - result.m[0] = A.m[0] * B.m[0] + A.m[4] * B.m[1] + A.m[8] * B.m[2] + A.m[12] * B.m[3]; - result.m[1] = A.m[1] * B.m[0] + A.m[5] * B.m[1] + A.m[9] * B.m[2] + A.m[13] * B.m[3]; - result.m[2] = A.m[2] * B.m[0] + A.m[6] * B.m[1] + A.m[10] * B.m[2] + A.m[14] * B.m[3]; - result.m[3] = A.m[3] * B.m[0] + A.m[7] * B.m[1] + A.m[11] * B.m[2] + A.m[15] * B.m[3]; - result.m[4] = A.m[0] * B.m[4] + A.m[4] * B.m[5] + A.m[8] * B.m[6] + A.m[12] * B.m[7]; - result.m[5] = A.m[1] * B.m[4] + A.m[5] * B.m[5] + A.m[9] * B.m[6] + A.m[13] * B.m[7]; - result.m[6] = A.m[2] * B.m[4] + A.m[6] * B.m[5] + A.m[10] * B.m[6] + A.m[14] * B.m[7]; - result.m[7] = A.m[3] * B.m[4] + A.m[7] * B.m[5] + A.m[11] * B.m[6] + A.m[15] * B.m[7]; - result.m[8] = A.m[0] * B.m[8] + A.m[4] * B.m[9] + A.m[8] * B.m[10] + A.m[12] * B.m[11]; - result.m[9] = A.m[1] * B.m[8] + A.m[5] * B.m[9] + A.m[9] * B.m[10] + A.m[13] * B.m[11]; - result.m[10] = A.m[2] * B.m[8] + A.m[6] * B.m[9] + A.m[10] * B.m[10] + A.m[14] * B.m[11]; - result.m[11] = A.m[3] * B.m[8] + A.m[7] * B.m[9] + A.m[11] * B.m[10] + A.m[15] * B.m[11]; - result.m[12] = A.m[0] * B.m[12] + A.m[4] * B.m[13] + A.m[8] * B.m[14] + A.m[12] * B.m[15]; - result.m[13] = A.m[1] * B.m[12] + A.m[5] * B.m[13] + A.m[9] * B.m[14] + A.m[13] * B.m[15]; - result.m[14] = A.m[2] * B.m[12] + A.m[6] * B.m[13] + A.m[10] * B.m[14] + A.m[14] * B.m[15]; - result.m[15] = A.m[3] * B.m[12] + A.m[7] * B.m[13] + A.m[11] * B.m[14] + A.m[15] * B.m[15]; - return result; -} -com.engine.math.Matrix.FromArray = function(array,offset) { - if(offset == null) offset = 0; - var result = new com.engine.math.Matrix(); - com.engine.math.Matrix.FromArrayToRef(array,offset,result); - return result; -} -com.engine.math.Matrix.FromArrayToRef = function(array,offset,result) { - if(offset == null) offset = 0; - var _g = 0; - while(_g < 16) { - var index = _g++; - result.m[index] = array[index + offset]; - } - return result; -} -com.engine.math.Matrix.FromValues = function(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44) { - var result = new com.engine.math.Matrix(); - result.m[0] = m11; - result.m[1] = m12; - result.m[2] = m13; - result.m[3] = m14; - result.m[4] = m21; - result.m[5] = m22; - result.m[6] = m23; - result.m[7] = m24; - result.m[8] = m31; - result.m[9] = m32; - result.m[10] = m33; - result.m[11] = m34; - result.m[12] = m41; - result.m[13] = m42; - result.m[14] = m43; - result.m[15] = m44; - return result; -} -com.engine.math.Matrix.FromValuesToRef = function(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44,result) { - result.m[0] = m11; - result.m[1] = m12; - result.m[2] = m13; - result.m[3] = m14; - result.m[4] = m21; - result.m[5] = m22; - result.m[6] = m23; - result.m[7] = m24; - result.m[8] = m31; - result.m[9] = m32; - result.m[10] = m33; - result.m[11] = m34; - result.m[12] = m41; - result.m[13] = m42; - result.m[14] = m43; - result.m[15] = m44; - return result; -} -com.engine.math.Matrix.Identity = function() { - return com.engine.math.Matrix.FromValues(1.0,0,0,0,0,1.0,0,0,0,0,1.0,0,0,0,0,1.0); -} -com.engine.math.Matrix.IdentityToRef = function(result) { - result.m[0] = 1.0; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = 1.0; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = 1.0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - result; - return result; -} -com.engine.math.Matrix.Zero = function() { - return com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -} -com.engine.math.Matrix.RotationX = function(angle) { - var result = new com.engine.math.Matrix(); - com.engine.math.Matrix.RotationXToRef(angle,result); - return result; -} -com.engine.math.Matrix.RotationXToRef = function(angle,result) { - var s = Math.sin(angle); - var c = Math.cos(angle); - result.m[0] = 1.0; - result.m[15] = 1.0; - result.m[5] = c; - result.m[10] = c; - result.m[9] = -s; - result.m[6] = s; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - return result; -} -com.engine.math.Matrix.RotationY = function(angle) { - var result = new com.engine.math.Matrix(); - com.engine.math.Matrix.RotationYToRef(angle,result); - return result; -} -com.engine.math.Matrix.RotationYToRef = function(angle,result) { - var s = Math.sin(angle); - var c = Math.cos(angle); - result.m[5] = 1.0; - result.m[15] = 1.0; - result.m[0] = c; - result.m[2] = -s; - result.m[8] = s; - result.m[10] = c; - result.m[1] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[6] = 0; - result.m[7] = 0; - result.m[9] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - return result; -} -com.engine.math.Matrix.RotationZ = function(angle) { - var result = new com.engine.math.Matrix(); - com.engine.math.Matrix.RotationZToRef(angle,result); - return result; -} -com.engine.math.Matrix.RotationZToRef = function(angle,result) { - var s = Math.sin(angle); - var c = Math.cos(angle); - result.m[10] = 1.0; - result.m[15] = 1.0; - result.m[0] = c; - result.m[1] = s; - result.m[4] = -s; - result.m[5] = c; - result.m[2] = 0; - result.m[3] = 0; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - return result; -} -com.engine.math.Matrix.RotationAxis = function(axis,angle) { - var s = Math.sin(-angle); - var c = Math.cos(-angle); - var c1 = 1 - c; - axis.normalize(); - var result = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - result.m[0] = axis.x * axis.x * c1 + c; - result.m[1] = axis.x * axis.y * c1 - axis.z * s; - result.m[2] = axis.x * axis.z * c1 + axis.y * s; - result.m[3] = 0.0; - result.m[4] = axis.y * axis.x * c1 + axis.z * s; - result.m[5] = axis.y * axis.y * c1 + c; - result.m[6] = axis.y * axis.z * c1 - axis.x * s; - result.m[7] = 0.0; - result.m[8] = axis.z * axis.x * c1 - axis.y * s; - result.m[9] = axis.z * axis.y * c1 + axis.x * s; - result.m[10] = axis.z * axis.z * c1 + c; - result.m[11] = 0.0; - result.m[15] = 1.0; - return result; -} -com.engine.math.Matrix.RotationYawPitchRoll = function(yaw,pitch,roll) { - var result = new com.engine.math.Matrix(); - com.engine.math.Matrix.RotationYawPitchRollToRef(yaw,pitch,roll,result); - return result; -} -com.engine.math.Matrix.RotationYawPitchRollToRef = function(yaw,pitch,roll,result) { - var tempQuaternion = new com.engine.math.Quaternion(); - tempQuaternion = com.engine.math.Quaternion.RotationYawPitchRollToRef(yaw,pitch,roll,tempQuaternion); - return tempQuaternion.toRotationMatrix(result); -} -com.engine.math.Matrix.Scaling = function(x,y,z) { - var result = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - result.m[0] = x; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = y; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = z; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - result; - return result; -} -com.engine.math.Matrix.ScalingToRef = function(x,y,z,result) { - result.m[0] = x; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = y; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = z; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - return result; -} -com.engine.math.Matrix.Translation = function(x,y,z) { - var result = com.engine.math.Matrix.FromValues(1.0,0,0,0,0,1.0,0,0,0,0,1.0,0,0,0,0,1.0); - result.m[0] = 1.0; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = 1.0; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = 1.0; - result.m[11] = 0; - result.m[12] = x; - result.m[13] = y; - result.m[14] = z; - result.m[15] = 1.0; - result; - return result; -} -com.engine.math.Matrix.TranslationToRef = function(x,y,z,result) { - result.m[0] = 1.0; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = 1.0; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = 1.0; - result.m[11] = 0; - result.m[12] = x; - result.m[13] = y; - result.m[14] = z; - result.m[15] = 1.0; - result; -} -com.engine.math.Matrix.LookAtLH = function(eye,target,up) { - var result = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - com.engine.math.Matrix.LookAtLHToRef(eye,target,up,result); - return result; -} -com.engine.math.Matrix.LookAtLHToRef = function(eye,target,up,result) { - var xAxis = com.engine.math.Vector3.Zero(); - var yAxis = com.engine.math.Vector3.Zero(); - var zAxis = com.engine.math.Vector3.Zero(); - zAxis.x = target.x - eye.x; - zAxis.y = target.y - eye.y; - zAxis.z = target.z - eye.z; - zAxis.normalize(); - xAxis.x = up.y * zAxis.z - up.z * zAxis.y; - xAxis.y = up.z * zAxis.x - up.x * zAxis.z; - xAxis.z = up.x * zAxis.y - up.y * zAxis.x; - xAxis.normalize(); - yAxis.x = zAxis.y * xAxis.z - zAxis.z * xAxis.y; - yAxis.y = zAxis.z * xAxis.x - zAxis.x * xAxis.z; - yAxis.z = zAxis.x * xAxis.y - zAxis.y * xAxis.x; - yAxis.normalize(); - var ex = -(xAxis.x * eye.x + xAxis.y * eye.y + xAxis.z * eye.z); - var ey = -(yAxis.x * eye.x + yAxis.y * eye.y + yAxis.z * eye.z); - var ez = -(zAxis.x * eye.x + zAxis.y * eye.y + zAxis.z * eye.z); - return (function($this) { - var $r; - result.m[0] = xAxis.x; - result.m[1] = yAxis.x; - result.m[2] = zAxis.x; - result.m[3] = 0; - result.m[4] = xAxis.y; - result.m[5] = yAxis.y; - result.m[6] = zAxis.y; - result.m[7] = 0; - result.m[8] = xAxis.z; - result.m[9] = yAxis.z; - result.m[10] = zAxis.z; - result.m[11] = 0; - result.m[12] = ex; - result.m[13] = ey; - result.m[14] = ez; - result.m[15] = 1; - $r = result; - return $r; - }(this)); -} -com.engine.math.Matrix.OrthoLH = function(width,height,znear,zfar) { - var hw = 2.0 / width; - var hh = 2.0 / height; - var id = 1.0 / (zfar - znear); - var nid = znear / (znear - zfar); - return com.engine.math.Matrix.FromValues(hw,0,0,0,0,hh,0,0,0,0,id,0,0,0,nid,1); -} -com.engine.math.Matrix.OrthoOffCenterLH = function(left,right,bottom,top,znear,zfar) { - var matrix = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - matrix.m[0] = 2.0 / (right - left); - matrix.m[1] = matrix.m[2] = matrix.m[3] = matrix.m[4] = 0; - matrix.m[5] = 2.0 / (top - bottom); - matrix.m[6] = matrix.m[7] = 0; - matrix.m[8] = matrix.m[9] = 0; - matrix.m[10] = -1 / (znear - zfar); - matrix.m[11] = 0; - matrix.m[12] = (left + right) / (left - right); - matrix.m[13] = (top + bottom) / (bottom - top); - matrix.m[14] = znear / (znear - zfar); - matrix.m[15] = 1.0; - matrix; - return matrix; -} -com.engine.math.Matrix.OrthoOffCenterLHToRef = function(left,right,bottom,top,znear,zfar,result) { - result.m[0] = 2.0 / (right - left); - result.m[1] = result.m[2] = result.m[3] = result.m[4] = 0; - result.m[5] = 2.0 / (top - bottom); - result.m[6] = result.m[7] = 0; - result.m[8] = result.m[9] = 0; - result.m[10] = -1 / (znear - zfar); - result.m[11] = 0; - result.m[12] = (left + right) / (left - right); - result.m[13] = (top + bottom) / (bottom - top); - result.m[14] = znear / (znear - zfar); - result.m[15] = 1.0; - return result; -} -com.engine.math.Matrix.PerspectiveLH = function(width,height,znear,zfar) { - var matrix = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - matrix.m[0] = 2.0 * znear / width; - matrix.m[1] = matrix.m[2] = matrix.m[3] = 0.0; - matrix.m[5] = 2.0 * znear / height; - matrix.m[4] = matrix.m[6] = matrix.m[7] = 0.0; - matrix.m[10] = -zfar / (znear - zfar); - matrix.m[8] = matrix.m[9] = 0.0; - matrix.m[11] = 1.0; - matrix.m[12] = matrix.m[13] = matrix.m[15] = 0.0; - matrix.m[14] = znear * zfar / (znear - zfar); - return matrix; -} -com.engine.math.Matrix.PerspectiveFovLH = function(fov,aspect,znear,zfar) { - var matrix = com.engine.math.Matrix.FromValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - com.engine.math.Matrix.PerspectiveFovLHToRef(fov,aspect,znear,zfar,matrix); - return matrix; -} -com.engine.math.Matrix.PerspectiveFovLHToRef = function(fov,aspect,znear,zfar,result) { - var tan = 1.0 / Math.tan(fov * 0.5); - result.m[0] = tan / aspect; - result.m[1] = result.m[2] = result.m[3] = 0.0; - result.m[5] = tan; - result.m[4] = result.m[6] = result.m[7] = 0.0; - result.m[8] = result.m[9] = 0.0; - result.m[10] = -zfar / (znear - zfar); - result.m[11] = 1.0; - result.m[12] = result.m[13] = result.m[15] = 0.0; - result.m[14] = znear * zfar / (znear - zfar); - return result; -} -com.engine.math.Matrix.Transpose = function(matrix) { - var result = new com.engine.math.Matrix(); - result.m[0] = matrix.m[0]; - result.m[1] = matrix.m[4]; - result.m[2] = matrix.m[8]; - result.m[3] = matrix.m[12]; - result.m[4] = matrix.m[1]; - result.m[5] = matrix.m[5]; - result.m[6] = matrix.m[9]; - result.m[7] = matrix.m[13]; - result.m[8] = matrix.m[2]; - result.m[9] = matrix.m[6]; - result.m[10] = matrix.m[10]; - result.m[11] = matrix.m[14]; - result.m[12] = matrix.m[3]; - result.m[13] = matrix.m[7]; - result.m[14] = matrix.m[11]; - result.m[15] = matrix.m[15]; - return result; -} -com.engine.math.Matrix.Reflection = function(plane) { - var matrix = new com.engine.math.Matrix(); - com.engine.math.Matrix.ReflectionToRef(plane,matrix); - return matrix; -} -com.engine.math.Matrix.create2D = function(x,y,scale,rotation) { - if(rotation == null) rotation = 0; - if(scale == null) scale = 1; - var theta = rotation * Math.PI / 180.0; - var c = Math.cos(theta); - var s = Math.sin(theta); - return com.engine.math.Matrix.FromArray([c * scale,-s * scale,0,0,s * scale,c * scale,0,0,0,0,1,0,x,y,0,1],null); -} -com.engine.math.Matrix.ReflectionToRef = function(plane,result) { - plane.normalize(); - var x = plane.normal.x; - var y = plane.normal.y; - var z = plane.normal.z; - var temp = -2 * x; - var temp2 = -2 * y; - var temp3 = -2 * z; - result.m[0] = temp * x + 1; - result.m[1] = temp2 * x; - result.m[2] = temp3 * x; - result.m[3] = 0.0; - result.m[4] = temp * y; - result.m[5] = temp2 * y + 1; - result.m[6] = temp3 * y; - result.m[7] = 0.0; - result.m[8] = temp * z; - result.m[9] = temp2 * z; - result.m[10] = temp3 * z + 1; - result.m[11] = 0.0; - result.m[12] = temp * plane.d; - result.m[13] = temp2 * plane.d; - result.m[14] = temp3 * plane.d; - result.m[15] = 1.0; - return result; -} -com.engine.math.Matrix.prototype = { - set2Dtransformation: function(x,y,scale,rotation) { - if(rotation == null) rotation = 0; - if(scale == null) scale = 1; - var theta = rotation * Math.PI / 180.0; - var c = Math.cos(theta); - var s = Math.sin(theta); - this.fillArrayTo([c * scale,-s * scale,0,0,s * scale,c * scale,0,0,0,0,1,0,x,y,0,1]); - } - ,fillArrayTo: function(array) { - var _g = 0; - while(_g < 16) { - var index = _g++; - this.m[index] = array[index]; - } - } - ,clone: function() { - return com.engine.math.Matrix.FromValues(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5],this.m[6],this.m[7],this.m[8],this.m[9],this.m[10],this.m[11],this.m[12],this.m[13],this.m[14],this.m[15]); - } - ,equals: function(value) { - return this.m[0] == value.m[0] && this.m[1] == value.m[1] && this.m[2] == value.m[2] && this.m[3] == value.m[3] && this.m[4] == value.m[4] && this.m[5] == value.m[5] && this.m[6] == value.m[6] && this.m[7] == value.m[7] && this.m[8] == value.m[8] && this.m[9] == value.m[9] && this.m[10] == value.m[10] && this.m[11] == value.m[11] && this.m[12] == value.m[12] && this.m[13] == value.m[13] && this.m[14] == value.m[14] && this.m[15] == value.m[15]; - } - ,multiplyToArray: function(other,result,offset) { - var tm0 = this.m[0]; - var tm1 = this.m[1]; - var tm2 = this.m[2]; - var tm3 = this.m[3]; - var tm4 = this.m[4]; - var tm5 = this.m[5]; - var tm6 = this.m[6]; - var tm7 = this.m[7]; - var tm8 = this.m[8]; - var tm9 = this.m[9]; - var tm10 = this.m[10]; - var tm11 = this.m[11]; - var tm12 = this.m[12]; - var tm13 = this.m[13]; - var tm14 = this.m[14]; - var tm15 = this.m[15]; - var om0 = other.m[0]; - var om1 = other.m[1]; - var om2 = other.m[2]; - var om3 = other.m[3]; - var om4 = other.m[4]; - var om5 = other.m[5]; - var om6 = other.m[6]; - var om7 = other.m[7]; - var om8 = other.m[8]; - var om9 = other.m[9]; - var om10 = other.m[10]; - var om11 = other.m[11]; - var om12 = other.m[12]; - var om13 = other.m[13]; - var om14 = other.m[14]; - var om15 = other.m[15]; - result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12; - result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13; - result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14; - result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15; - result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12; - result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13; - result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14; - result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15; - result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12; - result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13; - result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14; - result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15; - result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12; - result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13; - result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14; - result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15; - return result; - } - ,Multiply4x4: function(A,B) { - this.m[0] = A.m[0] * B.m[0] + A.m[4] * B.m[1] + A.m[8] * B.m[2] + A.m[12] * B.m[3]; - this.m[1] = A.m[1] * B.m[0] + A.m[5] * B.m[1] + A.m[9] * B.m[2] + A.m[13] * B.m[3]; - this.m[2] = A.m[2] * B.m[0] + A.m[6] * B.m[1] + A.m[10] * B.m[2] + A.m[14] * B.m[3]; - this.m[3] = A.m[3] * B.m[0] + A.m[7] * B.m[1] + A.m[11] * B.m[2] + A.m[15] * B.m[3]; - this.m[4] = A.m[0] * B.m[4] + A.m[4] * B.m[5] + A.m[8] * B.m[6] + A.m[12] * B.m[7]; - this.m[5] = A.m[1] * B.m[4] + A.m[5] * B.m[5] + A.m[9] * B.m[6] + A.m[13] * B.m[7]; - this.m[6] = A.m[2] * B.m[4] + A.m[6] * B.m[5] + A.m[10] * B.m[6] + A.m[14] * B.m[7]; - this.m[7] = A.m[3] * B.m[4] + A.m[7] * B.m[5] + A.m[11] * B.m[6] + A.m[15] * B.m[7]; - this.m[8] = A.m[0] * B.m[8] + A.m[4] * B.m[9] + A.m[8] * B.m[10] + A.m[12] * B.m[11]; - this.m[9] = A.m[1] * B.m[8] + A.m[5] * B.m[9] + A.m[9] * B.m[10] + A.m[13] * B.m[11]; - this.m[10] = A.m[2] * B.m[8] + A.m[6] * B.m[9] + A.m[10] * B.m[10] + A.m[14] * B.m[11]; - this.m[11] = A.m[3] * B.m[8] + A.m[7] * B.m[9] + A.m[11] * B.m[10] + A.m[15] * B.m[11]; - this.m[12] = A.m[0] * B.m[12] + A.m[4] * B.m[13] + A.m[8] * B.m[14] + A.m[12] * B.m[15]; - this.m[13] = A.m[1] * B.m[12] + A.m[5] * B.m[13] + A.m[9] * B.m[14] + A.m[13] * B.m[15]; - this.m[14] = A.m[2] * B.m[12] + A.m[6] * B.m[13] + A.m[10] * B.m[14] + A.m[14] * B.m[15]; - this.m[15] = A.m[3] * B.m[12] + A.m[7] * B.m[13] + A.m[11] * B.m[14] + A.m[15] * B.m[15]; - } - ,multiplyToRef: function(other,result) { - this.multiplyToArray(other,result.m,0); - } - ,copyFrom: function(other) { - var _g = 0; - while(_g < 16) { - var index = _g++; - this.m[index] = other.m[index]; - } - } - ,multiply: function(other) { - var result = new com.engine.math.Matrix(); - this.multiplyToArray(other,result.m,0); - return result; - } - ,setTranslation: function(vector3) { - this.m[12] = vector3.x; - this.m[13] = vector3.y; - this.m[14] = vector3.z; - } - ,invertToRef: function(other) { - var l1 = this.m[0]; - var l2 = this.m[1]; - var l3 = this.m[2]; - var l4 = this.m[3]; - var l5 = this.m[4]; - var l6 = this.m[5]; - var l7 = this.m[6]; - var l8 = this.m[7]; - var l9 = this.m[8]; - var l10 = this.m[9]; - var l11 = this.m[10]; - var l12 = this.m[11]; - var l13 = this.m[12]; - var l14 = this.m[13]; - var l15 = this.m[14]; - var l16 = this.m[15]; - var l17 = l11 * l16 - l12 * l15; - var l18 = l10 * l16 - l12 * l14; - var l19 = l10 * l15 - l11 * l14; - var l20 = l9 * l16 - l12 * l13; - var l21 = l9 * l15 - l11 * l13; - var l22 = l9 * l14 - l10 * l13; - var l23 = l6 * l17 - l7 * l18 + l8 * l19; - var l24 = -(l5 * l17 - l7 * l20 + l8 * l21); - var l25 = l5 * l18 - l6 * l20 + l8 * l22; - var l26 = -(l5 * l19 - l6 * l21 + l7 * l22); - var l27 = 1.0 / (l1 * l23 + l2 * l24 + l3 * l25 + l4 * l26); - var l28 = l7 * l16 - l8 * l15; - var l29 = l6 * l16 - l8 * l14; - var l30 = l6 * l15 - l7 * l14; - var l31 = l5 * l16 - l8 * l13; - var l32 = l5 * l15 - l7 * l13; - var l33 = l5 * l14 - l6 * l13; - var l34 = l7 * l12 - l8 * l11; - var l35 = l6 * l12 - l8 * l10; - var l36 = l6 * l11 - l7 * l10; - var l37 = l5 * l12 - l8 * l9; - var l38 = l5 * l11 - l7 * l9; - var l39 = l5 * l10 - l6 * l9; - other.m[0] = l23 * l27; - other.m[4] = l24 * l27; - other.m[8] = l25 * l27; - other.m[12] = l26 * l27; - other.m[1] = -(l2 * l17 - l3 * l18 + l4 * l19) * l27; - other.m[5] = (l1 * l17 - l3 * l20 + l4 * l21) * l27; - other.m[9] = -(l1 * l18 - l2 * l20 + l4 * l22) * l27; - other.m[13] = (l1 * l19 - l2 * l21 + l3 * l22) * l27; - other.m[2] = (l2 * l28 - l3 * l29 + l4 * l30) * l27; - other.m[6] = -(l1 * l28 - l3 * l31 + l4 * l32) * l27; - other.m[10] = (l1 * l29 - l2 * l31 + l4 * l33) * l27; - other.m[14] = -(l1 * l30 - l2 * l32 + l3 * l33) * l27; - other.m[3] = -(l2 * l34 - l3 * l35 + l4 * l36) * l27; - other.m[7] = (l1 * l34 - l3 * l37 + l4 * l38) * l27; - other.m[11] = -(l1 * l35 - l2 * l37 + l4 * l39) * l27; - other.m[15] = (l1 * l36 - l2 * l38 + l3 * l39) * l27; - } - ,invert: function() { - this.invertToRef(this); - } - ,toArray: function() { - return this.m; - } - ,determinant: function() { - var temp1 = this.m[10] * this.m[15] - this.m[11] * this.m[14]; - var temp2 = this.m[9] * this.m[15] - this.m[11] * this.m[13]; - var temp3 = this.m[9] * this.m[14] - this.m[10] * this.m[13]; - var temp4 = this.m[8] * this.m[15] - this.m[11] * this.m[12]; - var temp5 = this.m[8] * this.m[14] - this.m[10] * this.m[12]; - var temp6 = this.m[8] * this.m[13] - this.m[9] * this.m[12]; - return this.m[0] * (this.m[5] * temp1 - this.m[6] * temp2 + this.m[7] * temp3) - this.m[1] * (this.m[4] * temp1 - this.m[6] * temp4 + this.m[7] * temp5) + this.m[2] * (this.m[4] * temp2 - this.m[5] * temp4 + this.m[7] * temp6) - this.m[3] * (this.m[4] * temp3 - this.m[5] * temp5 + this.m[6] * temp6); - } - ,isIdentity: function() { - var ret = true; - if(this.m[0] != 1.0 || this.m[5] != 1.0 || this.m[10] != 1.0 || this.m[15] != 1.0) ret = false; - if(this.m[1] != 0.0 || this.m[2] != 0.0 || this.m[3] != 0.0 || this.m[4] != 0.0 || this.m[6] != 0.0 || this.m[7] != 0.0 || this.m[8] != 0.0 || this.m[9] != 0.0 || this.m[11] != 0.0 || this.m[12] != 0.0 || this.m[13] != 0.0 || this.m[14] != 0.0) ret = false; - return ret; - } - ,__class__: com.engine.math.Matrix -} -com.engine.math.Plane = function(a,b,c,d) { - this.normal = new com.engine.math.Vector3(a,b,c); - this.d = d; -}; -$hxClasses["com.engine.math.Plane"] = com.engine.math.Plane; -com.engine.math.Plane.__name__ = ["com","engine","math","Plane"]; -com.engine.math.Plane.FromArray = function(array) { - return new com.engine.math.Plane(array[0],array[1],array[2],array[3]); -} -com.engine.math.Plane.FromPoints = function(point1,point2,point3) { - var result = new com.engine.math.Plane(0,0,0,0); - result.copyFromPoints(point1,point2,point3); - return result; -} -com.engine.math.Plane.FromPositionAndNormal = function(origin,normal) { - var result = new com.engine.math.Plane(0,0,0,0); - normal.normalize(); - result.normal = normal; - result.d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); - return result; -} -com.engine.math.Plane.SignedDistanceToPlaneFromPositionAndNormal = function(origin,normal,point) { - var d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); - return point.x * normal.x + point.y * normal.y + point.z * normal.z + d; -} -com.engine.math.Plane.prototype = { - signedDistanceTo: function(point) { - return com.engine.math.Vector3.Dot(point,this.normal) + this.d; - } - ,isFrontFacingTo: function(direction,epsilon) { - var dot = com.engine.math.Vector3.Dot(this.normal,direction); - return dot <= epsilon; - } - ,copyFromPoints: function(point1,point2,point3) { - var x1 = point2.x - point1.x; - var y1 = point2.y - point1.y; - var z1 = point2.z - point1.z; - var x2 = point3.x - point1.x; - var y2 = point3.y - point1.y; - var z2 = point3.z - point1.z; - var yz = y1 * z2 - z1 * y2; - var xz = z1 * x2 - x1 * z2; - var xy = x1 * y2 - y1 * x2; - var pyth = Math.sqrt(yz * yz + xz * xz + xy * xy); - var invPyth; - if(pyth != 0) invPyth = 1.0 / pyth; else invPyth = 0; - this.normal.x = yz * invPyth; - this.normal.y = xz * invPyth; - this.normal.z = xy * invPyth; - this.d = -(this.normal.x * point1.x + this.normal.y * point1.y + this.normal.z * point1.z); - } - ,dotCoordinate: function(point) { - return this.normal.x * point.x + this.normal.y * point.y + this.normal.z * point.z + this.d; - } - ,transform: function(transformation) { - var transposedMatrix = com.engine.math.Matrix.Transpose(transformation); - var x = this.normal.x; - var y = this.normal.y; - var z = this.normal.z; - var d = this.d; - var normalX = x * transposedMatrix.m[0] + y * transposedMatrix.m[1] + z * transposedMatrix.m[2] + d * transposedMatrix.m[3]; - var normalY = x * transposedMatrix.m[4] + y * transposedMatrix.m[5] + z * transposedMatrix.m[6] + d * transposedMatrix.m[7]; - var normalZ = x * transposedMatrix.m[8] + y * transposedMatrix.m[9] + z * transposedMatrix.m[10] + d * transposedMatrix.m[11]; - var finalD = x * transposedMatrix.m[12] + y * transposedMatrix.m[13] + z * transposedMatrix.m[14] + d * transposedMatrix.m[15]; - return new com.engine.math.Plane(normalX,normalY,normalZ,finalD); - } - ,normalize: function() { - var norm = Math.sqrt(this.normal.x * this.normal.x + this.normal.y * this.normal.y + this.normal.z * this.normal.z); - var magnitude = 0; - if(norm != 0) magnitude = 1.0 / norm; - this.normal.x *= magnitude; - this.normal.y *= magnitude; - this.normal.z *= magnitude; - this.d *= magnitude; - } - ,clone: function() { - return new com.engine.math.Plane(this.normal.x,this.normal.y,this.normal.z,this.d); - } - ,__class__: com.engine.math.Plane -} -com.engine.math.Quaternion = function(initialX,initialY,initialZ,initialW) { - if(initialW == null) initialW = 0; - if(initialZ == null) initialZ = 0; - if(initialY == null) initialY = 0; - if(initialX == null) initialX = 0; - this.x = initialX; - this.y = initialY; - this.z = initialZ; - this.w = initialW; -}; -$hxClasses["com.engine.math.Quaternion"] = com.engine.math.Quaternion; -com.engine.math.Quaternion.__name__ = ["com","engine","math","Quaternion"]; -com.engine.math.Quaternion.FromArray = function(array,offset) { - if(offset == null) offset = 0; - return new com.engine.math.Quaternion(array[offset],array[offset + 1],array[offset + 2],array[offset + 3]); -} -com.engine.math.Quaternion.RotationYawPitchRoll = function(yaw,pitch,roll) { - var result = new com.engine.math.Quaternion(); - com.engine.math.Quaternion.RotationYawPitchRollToRef(yaw,pitch,roll,result); - return result; -} -com.engine.math.Quaternion.RotationYawPitchRollToRef = function(yaw,pitch,roll,result) { - var halfRoll = roll * 0.5; - var halfPitch = pitch * 0.5; - var halfYaw = yaw * 0.5; - var sinRoll = Math.sin(halfRoll); - var cosRoll = Math.cos(halfRoll); - var sinPitch = Math.sin(halfPitch); - var cosPitch = Math.cos(halfPitch); - var sinYaw = Math.sin(halfYaw); - var cosYaw = Math.cos(halfYaw); - result.x = cosYaw * sinPitch * cosRoll + sinYaw * cosPitch * sinRoll; - result.y = sinYaw * cosPitch * cosRoll - cosYaw * sinPitch * sinRoll; - result.z = cosYaw * cosPitch * sinRoll - sinYaw * sinPitch * cosRoll; - result.w = cosYaw * cosPitch * cosRoll + sinYaw * sinPitch * sinRoll; - return result; -} -com.engine.math.Quaternion.Slerp = function(left,right,amount) { - var num2; - var num3; - var num = amount; - var num4 = left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; - var flag = false; - if(num4 < 0) { - flag = true; - num4 = -num4; - } - if(num4 > 0.999999) { - num3 = 1 - num; - num2 = flag?-num:num; - } else { - var num5 = Math.acos(num4); - var num6 = 1.0 / Math.sin(num5); - num3 = Math.sin((1.0 - num) * num5) * num6; - num2 = flag?-Math.sin(num * num5) * num6:Math.sin(num * num5) * num6; - } - return new com.engine.math.Quaternion(num3 * left.x + num2 * right.x,num3 * left.y + num2 * right.y,num3 * left.z + num2 * right.z,num3 * left.w + num2 * right.w); -} -com.engine.math.Quaternion.prototype = { - toRotationMatrix: function(result) { - var xx = this.x * this.x; - var yy = this.y * this.y; - var zz = this.z * this.z; - var xy = this.x * this.y; - var zw = this.z * this.w; - var zx = this.z * this.x; - var yw = this.y * this.w; - var yz = this.y * this.z; - var xw = this.x * this.w; - result.m[0] = 1.0 - 2.0 * (yy + zz); - result.m[1] = 2.0 * (xy + zw); - result.m[2] = 2.0 * (zx - yw); - result.m[3] = 0; - result.m[4] = 2.0 * (xy - zw); - result.m[5] = 1.0 - 2.0 * (zz + xx); - result.m[6] = 2.0 * (yz + xw); - result.m[7] = 0; - result.m[8] = 2.0 * (zx + yw); - result.m[9] = 2.0 * (yz - xw); - result.m[10] = 1.0 - 2.0 * (yy + xx); - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - return result; - } - ,toEulerAngles: function() { - var qx = this.x; - var qy = this.y; - var qz = this.z; - var qw = this.w; - var sqx = qx * qx; - var sqy = qy * qy; - var sqz = qz * qz; - var yaw = Math.atan2(2.0 * (qy * qw - qx * qz),1.0 - 2.0 * (sqy + sqz)); - var pitch = Math.asin(2.0 * (qx * qy + qz * qw)); - var roll = Math.atan2(2.0 * (qx * qw - qy * qz),1.0 - 2.0 * (sqx + sqz)); - var gimbaLockTest = qx * qy + qz * qw; - if(gimbaLockTest > 0.499) { - yaw = 2.0 * Math.atan2(qx,qw); - roll = 0; - } else if(gimbaLockTest < -0.499) { - yaw = -2. * Math.atan2(qx,qw); - roll = 0; - } - return new com.engine.math.Vector3(pitch,yaw,roll); - } - ,normalize: function() { - var length = 1.0 / Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); - this.x *= length; - this.y *= length; - this.z *= length; - this.w *= length; - } - ,length: function() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); - } - ,multiplyToRef: function(q1,result) { - result.x = this.x * q1.w + this.y * q1.z - this.z * q1.y + this.w * q1.x; - result.y = -this.x * q1.z + this.y * q1.w + this.z * q1.x + this.w * q1.y; - result.z = this.x * q1.y - this.y * q1.x + this.z * q1.w + this.w * q1.z; - result.w = -this.x * q1.x - this.y * q1.y - this.z * q1.z + this.w * q1.w; - return result; - } - ,multiply: function(q1) { - var result = new com.engine.math.Quaternion(0,0,0,1.0); - result.x = this.x * q1.w + this.y * q1.z - this.z * q1.y + this.w * q1.x; - result.y = -this.x * q1.z + this.y * q1.w + this.z * q1.x + this.w * q1.y; - result.z = this.x * q1.y - this.y * q1.x + this.z * q1.w + this.w * q1.z; - result.w = -this.x * q1.x - this.y * q1.y - this.z * q1.z + this.w * q1.w; - result; - return result; - } - ,scale: function(value) { - return new com.engine.math.Quaternion(this.x * value,this.y * value,this.z * value,this.w * value); - } - ,add: function(other) { - return new com.engine.math.Quaternion(this.x + other.x,this.y + other.y,this.z + other.z,this.w + other.w); - } - ,copyFrom: function(other) { - this.x = other.x; - this.y = other.y; - this.z = other.z; - this.w = other.w; - } - ,clone: function() { - return new com.engine.math.Quaternion(this.x,this.y,this.z,this.w); - } - ,equals: function(otherQuaternion) { - return this.x == otherQuaternion.x && this.y == otherQuaternion.y && this.z == otherQuaternion.z && this.w == otherQuaternion.w; - } - ,toString: function() { - return "{X: " + this.x + " Y:" + this.y + " Z:" + this.z + " W:" + this.w + "}"; - } - ,__class__: com.engine.math.Quaternion -} com.engine.math.Vector2 = function(x,y) { this.x = x; this.y = y; @@ -3179,11 +2549,6 @@ com.engine.math.Vector2.Maximize = function(left,right) { var _y = left.y > right.y?left.y:right.y; return new com.engine.math.Vector2(_x,_y); } -com.engine.math.Vector2.Transform = function(vector,transformation) { - var _x = vector.x * transformation.m[0] + vector.y * transformation.m[4]; - var _y = vector.x * transformation.m[1] + vector.y * transformation.m[5]; - return new com.engine.math.Vector2(_x,_y); -} com.engine.math.Vector2.Distance = function(value1,value2) { return Math.sqrt(com.engine.math.Vector2.DistanceSquared(value1,value2)); } @@ -3245,337 +2610,61 @@ com.engine.math.Vector2.prototype = { } ,__class__: com.engine.math.Vector2 } -com.engine.math.Vector3 = function(initialX,initialY,initialZ) { - if(initialZ == null) initialZ = 0; - this.x = initialX; - this.y = initialY; - this.z = initialZ; -}; -$hxClasses["com.engine.math.Vector3"] = com.engine.math.Vector3; -com.engine.math.Vector3.__name__ = ["com","engine","math","Vector3"]; -com.engine.math.Vector3.Sub = function(a,b) { - return new com.engine.math.Vector3(a.x - b.x,a.y - b.y,a.z - b.z); -} -com.engine.math.Vector3.Add = function(a,b) { - return new com.engine.math.Vector3(a.x + b.x,a.y + b.y,a.z + b.z); -} -com.engine.math.Vector3.FromArray = function(array,offset) { - if(offset == null) offset = 0; - return new com.engine.math.Vector3(array[offset],array[offset + 1],array[offset + 2]); -} -com.engine.math.Vector3.FromArrayToRef = function(array,offset,result) { - if(offset == null) offset = 0; - result.x = array[offset]; - result.y = array[offset + 1]; - result.z = array[offset + 2]; -} -com.engine.math.Vector3.FromFloatsToRef = function(x,y,z,result) { - result.x = x; - result.y = y; - result.z = z; -} -com.engine.math.Vector3.Zero = function() { - return new com.engine.math.Vector3(0.0,0.0,0.0); -} -com.engine.math.Vector3.Up = function() { - return new com.engine.math.Vector3(0,1.0,0); -} -com.engine.math.Vector3.TransformCoordinates = function(vector,transformation) { - var result = com.engine.math.Vector3.Zero(); - com.engine.math.Vector3.TransformCoordinatesToRef(vector,transformation,result); - return result; +com.engine.misc = {} +com.engine.misc.Util = function() { } +$hxClasses["com.engine.misc.Util"] = com.engine.misc.Util; +com.engine.misc.Util.__name__ = ["com","engine","misc","Util"]; +com.engine.misc.Util.getTime = function() { + return flash.Lib.getTimer(); } -com.engine.math.Vector3.TransformCoordinatesToRef = function(vector,transformation,result) { - var x = vector.x * transformation.m[0] + vector.y * transformation.m[4] + vector.z * transformation.m[8] + transformation.m[12]; - var y = vector.x * transformation.m[1] + vector.y * transformation.m[5] + vector.z * transformation.m[9] + transformation.m[13]; - var z = vector.x * transformation.m[2] + vector.y * transformation.m[6] + vector.z * transformation.m[10] + transformation.m[14]; - var w = vector.x * transformation.m[3] + vector.y * transformation.m[7] + vector.z * transformation.m[11] + transformation.m[15]; - result.x = x / w; - result.y = y / w; - result.z = z / w; -} -com.engine.math.Vector3.TransformCoordinatesFromFloatsToRef = function(x,y,z,transformation,result) { - var rx = x * transformation.m[0] + y * transformation.m[4] + z * transformation.m[8] + transformation.m[12]; - var ry = x * transformation.m[1] + y * transformation.m[5] + z * transformation.m[9] + transformation.m[13]; - var rz = x * transformation.m[2] + y * transformation.m[6] + z * transformation.m[10] + transformation.m[14]; - var rw = x * transformation.m[3] + y * transformation.m[7] + z * transformation.m[11] + transformation.m[15]; - result.x = rx / rw; - result.y = ry / rw; - result.z = rz / rw; - return result; +com.engine.misc.Util.randf = function(max,min) { + return Math.random() * (max - min) + min; } -com.engine.math.Vector3.TransformNormal = function(vector,transformation) { - var result = com.engine.math.Vector3.Zero(); - result.x = vector.x * transformation.m[0] + vector.y * transformation.m[4] + vector.z * transformation.m[8]; - result.y = vector.x * transformation.m[1] + vector.y * transformation.m[5] + vector.z * transformation.m[9]; - result.z = vector.x * transformation.m[2] + vector.y * transformation.m[6] + vector.z * transformation.m[10]; - return result; +com.engine.misc.Util.randi = function(max,min) { + return Math.random() * (max - min) + min | 0; } -com.engine.math.Vector3.TransformNormalToRef = function(vector,transformation,result) { - result.x = vector.x * transformation.m[0] + vector.y * transformation.m[4] + vector.z * transformation.m[8]; - result.y = vector.x * transformation.m[1] + vector.y * transformation.m[5] + vector.z * transformation.m[9]; - result.z = vector.x * transformation.m[2] + vector.y * transformation.m[6] + vector.z * transformation.m[10]; +com.engine.misc.Util.WithinEpsilon = function(a,b) { + var num = a - b; + return -1.401298e-045 <= num && num <= 1.401298E-45; } -com.engine.math.Vector3.TransformNormalFromFloatsToRef = function(x,y,z,transformation,result) { - result.x = x * transformation.m[0] + y * transformation.m[4] + z * transformation.m[8]; - result.y = x * transformation.m[1] + y * transformation.m[5] + z * transformation.m[9]; - result.z = x * transformation.m[2] + y * transformation.m[6] + z * transformation.m[10]; +com.engine.misc.Util.getColorValue = function(color) { + var h = color >> 16 & 255; + var s = color >> 8 & 255; + var v = color & 255; + return (Math.max(h,Math.max(s,v)) | 0) / 255; } -com.engine.math.Vector3.CatmullRom = function(value1,value2,value3,value4,amount) { - var squared = amount * amount; - var cubed = amount * squared; - var x = 0.5 * (2.0 * value2.x + (-value1.x + value3.x) * amount + (2.0 * value1.x - 5.0 * value2.x + 4.0 * value3.x - value4.x) * squared + (-value1.x + 3.0 * value2.x - 3.0 * value3.x + value4.x) * cubed); - var y = 0.5 * (2.0 * value2.y + (-value1.y + value3.y) * amount + (2.0 * value1.y - 5.0 * value2.y + 4.0 * value3.y - value4.y) * squared + (-value1.y + 3.0 * value2.y - 3.0 * value3.y + value4.y) * cubed); - var z = 0.5 * (2.0 * value2.z + (-value1.z + value3.z) * amount + (2.0 * value1.z - 5.0 * value2.z + 4.0 * value3.z - value4.z) * squared + (-value1.z + 3.0 * value2.z - 3.0 * value3.z + value4.z) * cubed); - return new com.engine.math.Vector3(x,y,z); +com.engine.misc.Util.deg2rad = function(deg) { + return deg / 180.0 * Math.PI; } -com.engine.math.Vector3.Clamp = function(value,min,max) { - var x = value.x; - x = x > max.x?max.x:x; - x = x < min.x?min.x:x; - var y = value.y; - y = y > max.y?max.y:y; - y = y < min.y?min.y:y; - var z = value.z; - z = z > max.z?max.z:z; - z = z < min.z?min.z:z; - return new com.engine.math.Vector3(x,y,z); +com.engine.misc.Util.print = function(s) { } -com.engine.math.Vector3.Hermite = function(value1,tangent1,value2,tangent2,amount) { - var squared = amount * amount; - var cubed = amount * squared; - var part1 = 2.0 * cubed - 3.0 * squared + 1.0; - var part2 = -2. * cubed + 3.0 * squared; - var part3 = cubed - 2.0 * squared + amount; - var part4 = cubed - squared; - var x = value1.x * part1 + value2.x * part2 + tangent1.x * part3 + tangent2.x * part4; - var y = value1.y * part1 + value2.y * part2 + tangent1.y * part3 + tangent2.y * part4; - var z = value1.z * part1 + value2.z * part2 + tangent1.z * part3 + tangent2.z * part4; - return new com.engine.math.Vector3(x,y,z); -} -com.engine.math.Vector3.Lerp = function(start,end,amount) { - var x = start.x + (end.x - start.x) * amount; - var y = start.y + (end.y - start.y) * amount; - var z = start.z + (end.z - start.z) * amount; - return new com.engine.math.Vector3(x,y,z); -} -com.engine.math.Vector3.Dot = function(left,right) { - return left.x * right.x + left.y * right.y + left.z * right.z; -} -com.engine.math.Vector3.Cross = function(left,right) { - var result = com.engine.math.Vector3.Zero(); - result.x = left.y * right.z - left.z * right.y; - result.y = left.z * right.x - left.x * right.z; - result.z = left.x * right.y - left.y * right.x; - return result; +com.engine.misc.Util.deepCopy = function(arr) { + var r = new Array(); + var _g1 = 0, _g = arr.length; + while(_g1 < _g) { + var i = _g1++; + r.push(com.engine.misc.Util.copy(arr[i])); + } + return r; } -com.engine.math.Vector3.CrossToRef = function(left,right,result) { - result.x = left.y * right.z - left.z * right.y; - result.y = left.z * right.x - left.x * right.z; - result.z = left.x * right.y - left.y * right.x; -} -com.engine.math.Vector3.Normalize = function(vector) { - var result = com.engine.math.Vector3.Zero(); - result.x = vector.x; - result.y = vector.y; - result.z = vector.z; - result.normalize(); - return result; +com.engine.misc.Util.copy = function(value) { + if(js.Boot.__instanceof(value,Array)) return com.engine.misc.Util.deepCopy(value); else return value; } -com.engine.math.Vector3.NormalizeToRef = function(vector,result) { - result.x = vector.x; - result.y = vector.y; - result.z = vector.z; - result.normalize(); -} -com.engine.math.Vector3.Project = function(vector,world,transform,viewport) { - var cw = viewport.width; - var ch = viewport.height; - var cx = viewport.x; - var cy = viewport.y; - var viewportMatrix = com.engine.math.Matrix.FromValues(cw / 2.0,0,0,0,0,-ch / 2.0,0,0,0,0,1,0,cx + cw / 2.0,ch / 2.0 + cy,0,1); - var finalMatrix = world.multiply(transform).multiply(viewportMatrix); - return com.engine.math.Vector3.TransformCoordinates(vector,finalMatrix); -} -com.engine.math.Vector3.Unproject = function(source,viewportWidth,viewportHeight,world,view,projection) { - var matrix = world.multiply(view).multiply(projection); - matrix.invertToRef(matrix); - source.x = source.x / viewportWidth * 2 - 1; - source.y = -(source.y / viewportHeight * 2 - 1); - var vector = com.engine.math.Vector3.TransformCoordinates(source,matrix); - var num = source.x * matrix.m[3] + source.y * matrix.m[7] + source.z * matrix.m[11] + matrix.m[15]; - if(com.engine.misc.Util.WithinEpsilon(num,1.0)) vector = vector.scale(1.0 / num); - return vector; -} -com.engine.math.Vector3.Minimize = function(left,right) { - var x = left.x < right.x?left.x:right.x; - var y = left.y < right.y?left.y:right.y; - var z = left.z < right.z?left.z:right.z; - return new com.engine.math.Vector3(x,y,z); -} -com.engine.math.Vector3.Maximize = function(left,right) { - var x = left.x > right.x?left.x:right.x; - var y = left.y > right.y?left.y:right.y; - var z = left.z > right.z?left.z:right.z; - return new com.engine.math.Vector3(x,y,z); -} -com.engine.math.Vector3.Distance = function(value1,value2) { - return Math.sqrt(com.engine.math.Vector3.DistanceSquared(value1,value2)); -} -com.engine.math.Vector3.DistanceSquared = function(value1,value2) { - var x = value1.x - value2.x; - var y = value1.y - value2.y; - var z = value1.z - value2.z; - return x * x + y * y + z * z; -} -com.engine.math.Vector3.prototype = { - copyFromFloats: function(x,y,z) { - this.x = x; - this.y = y; - this.z = z; - } - ,copyFrom: function(source) { - this.x = source.x; - this.y = source.y; - this.z = source.z; - } - ,clone: function() { - return new com.engine.math.Vector3(this.x,this.y,this.z); +com.engine.misc.Util.getNextPowerOfTwo = function(number) { + if(number > 0 && (number & number - 1) == 0) return number; else { + var result = 1; + while(result < number) result <<= 1; + return result; } - ,normalize: function() { - var len = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - if(len != 0) { - var num = 1.0 / len; - this.x *= num; - this.y *= num; - this.z *= num; - } - } - ,lengthSquared: function() { - return this.x * this.x + this.y * this.y + this.z * this.z; - } - ,length: function() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - } - ,divideToRef: function(otherVector,result) { - result.x = this.x / otherVector.x; - result.y = this.y / otherVector.y; - result.z = this.z / otherVector.z; - } - ,divide: function(otherVector) { - return new com.engine.math.Vector3(this.x / otherVector.x,this.y / otherVector.y,this.z / otherVector.z); - } - ,multiplyByFloats: function(x,y,z) { - return new com.engine.math.Vector3(this.x * x,this.y * y,this.z * z); - } - ,multiplyToRef: function(otherVector,result) { - result.x = this.x * otherVector.x; - result.y = this.y * otherVector.y; - result.z = this.z * otherVector.z; - } - ,multiply: function(otherVector) { - return new com.engine.math.Vector3(this.x * otherVector.x,this.y * otherVector.y,this.z * otherVector.z); - } - ,multiplyInPlace: function(otherVector) { - this.x *= otherVector.x; - this.y *= otherVector.y; - this.z *= otherVector.z; - } - ,equalsToFloats: function(x,y,z) { - return this.x == x && this.y == y && this.z == z; - } - ,equals: function(otherVector) { - return this.x == otherVector.x && this.y == otherVector.y && this.z == otherVector.z; - } - ,scaleToRef: function(scale,result) { - result.x = this.x * scale; - result.y = this.y * scale; - result.z = this.z * scale; - } - ,scale: function(scale) { - return new com.engine.math.Vector3(this.x * scale,this.y * scale,this.z * scale); - } - ,scaleInPlace: function(scale) { - this.x *= scale; - this.y *= scale; - this.z *= scale; - } - ,negate: function() { - return new com.engine.math.Vector3(-this.x,-this.y,-this.z); - } - ,subtractFromFloatsToRef: function(x,y,z,result) { - result.x = this.x - x; - result.y = this.y - y; - result.z = this.z - z; - } - ,subtractFromFloats: function(x,y,z) { - return new com.engine.math.Vector3(this.x - x,this.y - y,this.z - z); - } - ,subtractToRef: function(otherVector,result) { - result.x = this.x - otherVector.x; - result.y = this.y - otherVector.y; - result.z = this.z - otherVector.z; - } - ,subtract: function(otherVector) { - return new com.engine.math.Vector3(this.x - otherVector.x,this.y - otherVector.y,this.z - otherVector.z); - } - ,subtractInPlace: function(otherVector) { - this.x -= otherVector.x; - this.y -= otherVector.y; - this.z -= otherVector.z; - } - ,addToRef: function(otherVector,result) { - result.x = this.x + otherVector.x; - result.y = this.y + otherVector.y; - result.z = this.z + otherVector.z; - return result; - } - ,add: function(otherVector) { - return new com.engine.math.Vector3(this.x + otherVector.x,this.y + otherVector.y,this.z + otherVector.z); - } - ,addInPlace: function(otherVector) { - this.x += otherVector.x; - this.y += otherVector.y; - this.z += otherVector.z; - } - ,toArray: function(array,index) { - if(index == null) index = 0; - array[index] = this.x; - array[index + 1] = this.y; - array[index + 2] = this.z; - return array; - } - ,asArray: function() { - var result = []; - result[0] = this.x; - result[1] = this.y; - result[2] = this.z; - result; - return result; - } - ,toString: function() { - return "{X:" + this.x + " Y:" + this.y + " Z:" + this.z + "}"; - } - ,set: function(initialX,initialY,initialZ) { - if(initialZ == null) initialZ = 0; - this.x = initialX; - this.y = initialY; - this.z = initialZ; - } - ,__class__: com.engine.math.Vector3 } -com.engine.misc = {} -com.engine.misc.MatrixHelp = function() { } -$hxClasses["com.engine.misc.MatrixHelp"] = com.engine.misc.MatrixHelp; -com.engine.misc.MatrixHelp.__name__ = ["com","engine","misc","MatrixHelp"]; -com.engine.misc.MatrixHelp.getScaled = function(source,newWidth,newHeight) { +com.engine.misc.Util.getScaled = function(source,newWidth,newHeight) { var m = new flash.geom.Matrix(); m.scale(newWidth / (source.___textureBuffer != null?source.___textureBuffer.width:0),newHeight / (source.___textureBuffer != null?source.___textureBuffer.height:0)); - var bmp = new flash.display.BitmapData(newWidth,newHeight,true); + var bmp = new flash.display.BitmapData(newWidth,newHeight,true,0); bmp.draw(source,m); return bmp; } -com.engine.misc.MatrixHelp.flipBitmapData = function(original,axis) { +com.engine.misc.Util.flipBitmapData = function(original,axis) { if(axis == null) axis = "y"; var flipped = new flash.display.BitmapData(original.___textureBuffer != null?original.___textureBuffer.width:0,original.___textureBuffer != null?original.___textureBuffer.height:0,true,0); var matrix; @@ -3583,14 +2672,14 @@ com.engine.misc.MatrixHelp.flipBitmapData = function(original,axis) { flipped.draw(original,matrix,null,null,null,true); return flipped; } -com.engine.misc.MatrixHelp.skew = function(matrix,skewX,skewY) { +com.engine.misc.Util.skew = function(matrix,skewX,skewY) { var sinX = Math.sin(skewX); var cosX = Math.cos(skewX); var sinY = Math.sin(skewY); var cosY = Math.cos(skewY); - com.engine.misc.MatrixHelp.setTo(matrix,matrix.a * cosY - matrix.b * sinX,matrix.a * sinY + matrix.b * cosX,matrix.c * cosY - matrix.d * sinX,matrix.c * sinY + matrix.d * cosX,matrix.tx * cosY - matrix.ty * sinX,matrix.tx * sinY + matrix.ty * cosX); + com.engine.misc.Util.setTo(matrix,matrix.a * cosY - matrix.b * sinX,matrix.a * sinY + matrix.b * cosX,matrix.c * cosY - matrix.d * sinX,matrix.c * sinY + matrix.d * cosX,matrix.tx * cosY - matrix.ty * sinX,matrix.tx * sinY + matrix.ty * cosX); } -com.engine.misc.MatrixHelp.setTo = function(matrix,a,b,c,d,tx,ty) { +com.engine.misc.Util.setTo = function(matrix,a,b,c,d,tx,ty) { matrix.a = a; matrix.b = b; matrix.c = c; @@ -3598,48 +2687,39 @@ com.engine.misc.MatrixHelp.setTo = function(matrix,a,b,c,d,tx,ty) { matrix.set_tx(tx); matrix.set_ty(ty); } -com.engine.misc.Util = function() { } -$hxClasses["com.engine.misc.Util"] = com.engine.misc.Util; -com.engine.misc.Util.__name__ = ["com","engine","misc","Util"]; -com.engine.misc.Util.randf = function(max,min) { - return Math.random() * (max - min) + min; -} -com.engine.misc.Util.randi = function(max,min) { - return Math.random() * (max - min) + min | 0; -} -com.engine.misc.Util.WithinEpsilon = function(a,b) { - var num = a - b; - return -1.401298e-045 <= num && num <= 1.401298E-45; -} -com.engine.misc.Util.getColorValue = function(color) { - var h = color >> 16 & 255; - var s = color >> 8 & 255; - var v = color & 255; - return (Math.max(h,Math.max(s,v)) | 0) / 255; -} -com.engine.misc.Util.deg2rad = function(deg) { - return deg / 180.0 * Math.PI; +com.engine.misc.Util.fillMatrix3DArrayTo = function(mat,array) { + var _g = 0; + while(_g < 16) { + var index = _g++; + } } -com.engine.misc.Util.print = function(s) { +com.engine.misc.Util.createOrtho = function(x0,x1,y0,y1,zNear,zFar) { + var sx = 1.0 / (x1 - x0); + var sy = 1.0 / (y1 - y0); + var sz = 1.0 / (zFar - zNear); + return new flash.geom.Matrix3D([2.0 * sx,0,0,0,0,2.0 * sy,0,0,0,0,-2. * sz,0,-(x0 + x1) * sx,-(y0 + y1) * sy,-(zNear + zFar) * sz,1]); } -com.engine.misc.Util.deepCopy = function(arr) { - var r = new Array(); - var _g1 = 0, _g = arr.length; - while(_g1 < _g) { - var i = _g1++; - r.push(com.engine.misc.Util.copy(arr[i])); - } - return r; +com.engine.misc.Util.setMatrixOrtho = function(mat,x0,x1,y0,y1,zNear,zFar) { + var sx = 1.0 / (x1 - x0); + var sy = 1.0 / (y1 - y0); + var sz = 1.0 / (zFar - zNear); + com.engine.misc.Util.fillMatrix3DArrayTo(mat,[2.0 * sx,0,0,0,0,2.0 * sy,0,0,0,0,-2. * sz,0,-(x0 + x1) * sx,-(y0 + y1) * sy,-(zNear + zFar) * sz,1]); } -com.engine.misc.Util.copy = function(value) { - if(js.Boot.__instanceof(value,Array)) return com.engine.misc.Util.deepCopy(value); else return value; +com.engine.misc.Util.set2Dtransformation = function(mat,x,y,scale,rotation) { + if(rotation == null) rotation = 0; + if(scale == null) scale = 1; + var theta = rotation * Math.PI / 180.0; + var c = Math.cos(theta); + var s = Math.sin(theta); } -com.engine.misc.Util.getNextPowerOfTwo = function(number) { - if(number > 0 && (number & number - 1) == 0) return number; else { - var result = 1; - while(result < number) result <<= 1; - return result; - } +com.engine.misc.Util.createMtrix2D = function(x,y,scale,rotation) { + if(rotation == null) rotation = 0; + if(scale == null) scale = 1; + var theta = rotation * Math.PI / 180.0; + var c = Math.cos(theta); + var s = Math.sin(theta); + var mat = new flash.geom.Matrix3D([c * scale,-s * scale,0,0,s * scale,c * scale,0,0,0,0,1,0,x,y,0,1]); + return mat; } com.engine.misc.Util.prototype = { getExponantOfTwo: function(value,max) { @@ -3654,48 +2734,316 @@ com.engine.misc.Util.prototype = { ,__class__: com.engine.misc.Util } com.engine.render = {} +com.engine.render.Buffer = function() { + this.position = new com.engine.math.Vector2(0,0); + this.rotation = 0; + this.scale = 1; + this.viewMatrix = new flash.geom.Matrix3D(); + this.scrollx = 1; + this.scrolly = 1; + this.x = 0; + this.y = 0; + this.update(); +}; +$hxClasses["com.engine.render.Buffer"] = com.engine.render.Buffer; +com.engine.render.Buffer.__name__ = ["com","engine","render","Buffer"]; +com.engine.render.Buffer.prototype = { + dispose: function() { + this.viewMatrix = null; + this.position = null; + } + ,update: function() { + this.viewMatrix.identity(); + this.viewMatrix.append(new flash.geom.Matrix3D([this.scale,0.0,0.0,0.0,0.0,this.scale,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,1.0])); + this.viewMatrix.appendTranslation(Math.round(this.position.x - com.engine.game.Game.camera.scrollX * this.scrollx),Math.round(this.position.y - com.engine.game.Game.camera.scrollY * this.scrolly),0); + } + ,combineMatrix: function(m) { + this.viewMatrix.append(m); + } + ,getMatrix: function() { + return this.viewMatrix; + } + ,__class__: com.engine.render.Buffer +} +com.engine.render.BatchPrimitives = function(capacity) { + com.engine.render.Buffer.call(this); + this.vertexBuffer = openfl.gl.GL.createBuffer(); + this.colorBuffer = openfl.gl.GL.createBuffer(); + this.fvertexBuffer = openfl.gl.GL.createBuffer(); + this.fcolorBuffer = openfl.gl.GL.createBuffer(); + this.capacity = capacity; + this.idxPos = 0; + this.idxCols = 0; + this.scrollx = 0; + this.scrolly = 0; + this.fidxPos = 0; + this.fidxCols = 0; + this.vertices = new Float32Array(capacity * 3 * 4); + openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); + openfl.gl.GL.bufferData(34962,this.vertices,35048); + this.colors = new Float32Array(capacity * 4 * 4); + openfl.gl.GL.bindBuffer(34962,this.colorBuffer); + openfl.gl.GL.bufferData(34962,this.colors,35048); + this.fvertices = new Float32Array(capacity * 3 * 4); + openfl.gl.GL.bindBuffer(34962,this.fvertexBuffer); + openfl.gl.GL.bufferData(34962,this.fvertices,35048); + this.fcolors = new Float32Array(capacity * 4 * 4); + openfl.gl.GL.bindBuffer(34962,this.fcolorBuffer); + openfl.gl.GL.bufferData(34962,this.fcolors,35048); + this.currentBlendMode = com.engine.render.BlendMode.NORMAL; + this.shader = new com.engine.render.PrimitiveShader(); +}; +$hxClasses["com.engine.render.BatchPrimitives"] = com.engine.render.BatchPrimitives; +com.engine.render.BatchPrimitives.__name__ = ["com","engine","render","BatchPrimitives"]; +com.engine.render.BatchPrimitives.__super__ = com.engine.render.Buffer; +com.engine.render.BatchPrimitives.prototype = $extend(com.engine.render.Buffer.prototype,{ + dispose: function() { + this.vertices = null; + this.colors = null; + openfl.gl.GL.deleteBuffer(this.vertexBuffer); + openfl.gl.GL.deleteBuffer(this.colorBuffer); + this.fvertices = null; + this.fcolors = null; + openfl.gl.GL.deleteBuffer(this.fvertexBuffer); + openfl.gl.GL.deleteBuffer(this.fcolorBuffer); + com.engine.render.Buffer.prototype.dispose.call(this); + } + ,fillrect: function(x,y,width,height,r,g,b,a) { + if(a == null) a = 1; + this.fvertex(x,y,0); + this.fcolor(r,g,b,a); + this.fvertex(x + width,y,0); + this.fcolor(r,g,b,a); + this.fvertex(x + width,y + height,0); + this.fcolor(r,g,b,a); + this.fvertex(x + width,y + height,0); + this.fcolor(r,g,b,a); + this.fvertex(x,y + height,0); + this.fcolor(r,g,b,a); + this.fvertex(x,y,0); + this.fcolor(r,g,b,a); + } + ,rect: function(x,y,width,height,r,g,b,a) { + if(a == null) a = 1; + this.vertex(x,y,0); + this.color(r,g,b,a); + this.vertex(x + width,y,0); + this.color(r,g,b,a); + this.vertex(x + width,y,0); + this.color(r,g,b,a); + this.vertex(x + width,y + height,0); + this.color(r,g,b,a); + this.vertex(x + width,y + height,0); + this.color(r,g,b,a); + this.vertex(x,y + height,0); + this.color(r,g,b,a); + this.vertex(x,y + height,0); + this.color(r,g,b,a); + this.vertex(x,y,0); + this.color(r,g,b,a); + } + ,line: function(x1,y1,x2,y2,r,g,b,a) { + if(a == null) a = 1; + this.vertex(x1,y1); + this.color(r,g,b,a); + this.vertex(x2,y2); + this.color(r,g,b,a); + } + ,fillellipse: function(x,y,width,height,segments,r,g,b,a) { + if(a == null) a = 1; + var angle = 6.2831852 / segments; + var cx = x + width / 2; + var cy = y + height / 2; + var _g = 0; + while(_g < segments) { + var i = _g++; + this.fvertex(cx + width * 0.5 * Math.cos(i * angle),cy + height * 0.5 * Math.sin(i * angle),0); + this.fcolor(r,g,b,a); + this.fvertex(cx,cy,0); + this.fcolor(r,g,b,a); + this.fvertex(cx + width * 0.5 * Math.cos((i + 1) * angle),cy + height * 0.5 * Math.sin((i + 1) * angle),0); + this.fcolor(r,g,b,a); + } + } + ,ellipse: function(x,y,width,height,segments,r,g,b,a) { + if(a == null) a = 1; + var angle = 6.2831852 / segments; + var cx = x + width / 2; + var cy = y + height / 2; + var _g = 0; + while(_g < segments) { + var i = _g++; + this.vertex(cx + width * 0.5 * Math.cos(i * angle),cy + height * 0.5 * Math.sin(i * angle),0); + this.color(r,g,b,a); + this.vertex(cx + width * 0.5 * Math.cos((i + 1) * angle),cy + height * 0.5 * Math.sin((i + 1) * angle),0); + this.color(r,g,b,a); + } + } + ,fillcircle: function(x,y,radius,segments,r,g,b,a) { + if(a == null) a = 1; + var angle = 6.2831852 / segments; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var cx = radius; + var cy = 0; + segments--; + var _g = 0; + while(_g < segments) { + var i = _g++; + this.fvertex(x,y,0); + this.fcolor(r,g,b,a); + this.fvertex(x + cx,y + cy,0); + this.fcolor(r,g,b,a); + var temp = cx; + cx = cos * cx - sin * cy; + cy = sin * temp + cos * cy; + this.fvertex(x + cx,y + cy,0); + this.fcolor(r,g,b,a); + } + this.fvertex(x,y,0); + this.fcolor(r,g,b,a); + this.fvertex(x + cx,y + cy,0); + this.fcolor(r,g,b,a); + var temp = cx; + cx = radius; + cy = 0; + this.fvertex(x + cx,y + cy,0); + this.fcolor(r,g,b,a); + } + ,circle: function(x,y,radius,segments,r,g,b,a) { + if(a == null) a = 1; + var angle = 6.2831852 / segments; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var cx = radius; + var cy = 0; + var _g = 0; + while(_g < segments) { + var i = _g++; + this.vertex(x + cx,y + cy,0); + this.color(r,g,b,a); + var temp = cx; + cx = cos * cx - sin * cy; + cy = sin * temp + cos * cy; + this.vertex(x + cx,y + cy,0); + this.color(r,g,b,a); + } + this.vertex(x + cx,y + cy,0); + this.color(r,g,b,a); + this.vertex(x,y,0); + this.color(r,g,b,a); + this.vertex(x + cx,y + cy,0); + this.color(r,g,b,a); + var temp = cx; + cx = radius; + cy = 0; + this.vertex(x + cx,y + cy,0); + this.color(r,g,b,a); + } + ,end: function() { + this.shader.Enable(); + com.engine.render.BlendMode.setBlend(this.currentBlendMode); + openfl.gl.GL.uniformMatrix3D(this.shader.projectionMatrixUniform,false,com.engine.game.Game.camera.projMatrix); + openfl.gl.GL.uniformMatrix3D(this.shader.modelViewMatrixUniform,false,this.viewMatrix); + openfl.gl.GL.bindBuffer(34962,this.fvertexBuffer); + openfl.gl.GL.bufferSubData(34962,0,this.fvertices); + openfl.gl.GL.vertexAttribPointer(this.shader.vertexAttribute,3,5126,false,0,0); + openfl.gl.GL.bindBuffer(34962,this.fcolorBuffer); + openfl.gl.GL.bufferSubData(34962,0,this.fcolors); + openfl.gl.GL.vertexAttribPointer(this.shader.colorAttribute,4,5126,false,0,0); + openfl.gl.GL.drawArrays(4,0,this.fidxPos / 3 | 0); + openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); + openfl.gl.GL.bufferSubData(34962,0,this.vertices); + openfl.gl.GL.vertexAttribPointer(this.shader.vertexAttribute,3,5126,false,0,0); + openfl.gl.GL.bindBuffer(34962,this.colorBuffer); + openfl.gl.GL.bufferSubData(34962,0,this.colors); + openfl.gl.GL.vertexAttribPointer(this.shader.colorAttribute,4,5126,false,0,0); + openfl.gl.GL.drawArrays(1,0,this.idxPos / 3 | 0); + this.shader.Disable(); + } + ,begin: function() { + this.idxPos = 0; + this.idxCols = 0; + this.fidxPos = 0; + this.fidxCols = 0; + this.update(); + } + ,fcolor: function(r,g,b,a) { + if(a == null) a = 0.0; + this.fcolors[this.fidxCols++] = r; + this.fcolors[this.fidxCols++] = g; + this.fcolors[this.fidxCols++] = b; + this.fcolors[this.fidxCols++] = a; + } + ,fvertex: function(x,y,z) { + if(z == null) z = 0.0; + this.fvertices[this.fidxPos++] = x; + this.fvertices[this.fidxPos++] = y; + this.fvertices[this.fidxPos++] = z; + } + ,color: function(r,g,b,a) { + if(a == null) a = 0.0; + this.colors[this.idxCols++] = r; + this.colors[this.idxCols++] = g; + this.colors[this.idxCols++] = b; + this.colors[this.idxCols++] = a; + } + ,vertex: function(x,y,z) { + if(z == null) z = 0.0; + this.vertices[this.idxPos++] = x; + this.vertices[this.idxPos++] = y; + this.vertices[this.idxPos++] = z; + } + ,__class__: com.engine.render.BatchPrimitives +}); com.engine.render.BlendMode = function() { } $hxClasses["com.engine.render.BlendMode"] = com.engine.render.BlendMode; com.engine.render.BlendMode.__name__ = ["com","engine","render","BlendMode"]; com.engine.render.BlendMode.setBlend = function(mode) { switch(mode) { - case 0: + case com.engine.render.BlendMode.NORMAL: openfl.gl.GL.blendFunc(770,771); break; - case 1: + case com.engine.render.BlendMode.ADD: openfl.gl.GL.blendFunc(770,772); break; - case 2: + case com.engine.render.BlendMode.MULTIPLY: openfl.gl.GL.blendFunc(774,771); break; - case 3: + case com.engine.render.BlendMode.SCREEN: openfl.gl.GL.blendFunc(770,1); break; + case com.engine.render.BlendMode.TRANSPARENT: + openfl.gl.GL.blendFunc(1,771); + break; default: openfl.gl.GL.blendFunc(1,771); } } -com.engine.render.Buffer = function() { - this.position = new com.engine.math.Vector2(0,0); - this.rotation = 0; +com.engine.render.Camera = function(width,height) { + this.projMatrix = com.engine.misc.Util.createOrtho(0,width,height,0,-1,1); + this.width = width; + this.height = height; + this.viewMatrix = new flash.geom.Matrix3D(); this.scale = 1; - this.viewMatrix = com.engine.math.Matrix.FromValues(1.0,0,0,0,0,1.0,0,0,0,0,1.0,0,0,0,0,1.0); + this.position = new com.engine.math.Vector2(0,0); + this.scrollX = 0; + this.scrollY = 0; }; -$hxClasses["com.engine.render.Buffer"] = com.engine.render.Buffer; -com.engine.render.Buffer.__name__ = ["com","engine","render","Buffer"]; -com.engine.render.Buffer.prototype = { - dispose: function() { +$hxClasses["com.engine.render.Camera"] = com.engine.render.Camera; +com.engine.render.Camera.__name__ = ["com","engine","render","Camera"]; +com.engine.render.Camera.prototype = { + resize: function(width,height) { + this.width = width; + this.height = height; + this.projMatrix = com.engine.misc.Util.createOrtho(0,width,height,0,-1,1); } ,update: function() { - this.viewMatrix.set2Dtransformation(Math.round(this.position.x),Math.round(this.position.y),this.scale,this.rotation); - } - ,combineMatrix: function(m) { - this.viewMatrix.Multiply4x4(this.viewMatrix,m); + this.viewMatrix.identity(); + this.viewMatrix.append(new flash.geom.Matrix3D([this.scale,0.0,0.0,0.0,0.0,this.scale,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,1.0])); + this.viewMatrix.appendTranslation(Math.round(this.position.x),Math.round(this.position.y),0); } - ,getMatrix: function() { - return this.viewMatrix; - } - ,__class__: com.engine.render.Buffer + ,__class__: com.engine.render.Camera } com.engine.render.Clip = function(x,y,width,height) { if(height == null) height = 0; @@ -3747,6 +3095,43 @@ com.engine.render.Image.__name__ = ["com","engine","render","Image"]; com.engine.render.Image.prototype = { __class__: com.engine.render.Image } +com.engine.render.PrimitiveShader = function() { + var vertexShader = openfl.gl.GL.createShader(35633); + openfl.gl.GL.shaderSource(vertexShader,com.engine.render.filter.Filter.colorVertexShader); + openfl.gl.GL.compileShader(vertexShader); + if(openfl.gl.GL.getShaderParameter(vertexShader,35713) == 0) throw openfl.gl.GL.getShaderInfoLog(vertexShader); + var fragmentShader = openfl.gl.GL.createShader(35632); + openfl.gl.GL.shaderSource(fragmentShader,com.engine.render.filter.Filter.colorFragmentShader); + openfl.gl.GL.compileShader(fragmentShader); + if(openfl.gl.GL.getShaderParameter(fragmentShader,35713) == 0) throw openfl.gl.GL.getShaderInfoLog(fragmentShader); + this.shaderProgram = openfl.gl.GL.createProgram(); + openfl.gl.GL.attachShader(this.shaderProgram,vertexShader); + openfl.gl.GL.attachShader(this.shaderProgram,fragmentShader); + openfl.gl.GL.linkProgram(this.shaderProgram); + if(openfl.gl.GL.getProgramParameter(this.shaderProgram,35714) == 0) throw "Unable to initialize the shader program."; + this.vertexAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aVertexPosition"); + this.colorAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aColor"); + this.projectionMatrixUniform = openfl.gl.GL.getUniformLocation(this.shaderProgram,"uProjectionMatrix"); + this.modelViewMatrixUniform = openfl.gl.GL.getUniformLocation(this.shaderProgram,"uModelViewMatrix"); +}; +$hxClasses["com.engine.render.PrimitiveShader"] = com.engine.render.PrimitiveShader; +com.engine.render.PrimitiveShader.__name__ = ["com","engine","render","PrimitiveShader"]; +com.engine.render.PrimitiveShader.prototype = { + dispose: function() { + openfl.gl.GL.deleteProgram(this.shaderProgram); + } + ,Disable: function() { + openfl.gl.GL.disableVertexAttribArray(this.vertexAttribute); + openfl.gl.GL.disableVertexAttribArray(this.colorAttribute); + openfl.gl.GL.useProgram(null); + } + ,Enable: function() { + openfl.gl.GL.useProgram(this.shaderProgram); + openfl.gl.GL.enableVertexAttribArray(this.vertexAttribute); + openfl.gl.GL.enableVertexAttribArray(this.colorAttribute); + } + ,__class__: com.engine.render.PrimitiveShader +} com.engine.render.SpriteBatch = function(capacity) { this.invTexHeight = 0; this.invTexWidth = 0; @@ -3755,7 +3140,7 @@ com.engine.render.SpriteBatch = function(capacity) { com.engine.render.Buffer.call(this); this.capacity = capacity; this.vertexStrideSize = 36; - this.numVerts = capacity * this.vertexStrideSize * 4; + this.numVerts = capacity * this.vertexStrideSize; this.numIndices = capacity * 6; this.vertices = new Float32Array(this.numVerts); var indices = []; @@ -3779,6 +3164,7 @@ com.engine.render.SpriteBatch = function(capacity) { this.indexBuffer = openfl.gl.GL.createBuffer(); openfl.gl.GL.bindBuffer(34963,this.indexBuffer); openfl.gl.GL.bufferData(34963,new Int16Array(indices),35044); + indices = null; openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); openfl.gl.GL.bufferData(34962,this.vertices,35048); this.shader = new com.engine.render.SpriteShader(); @@ -3809,11 +3195,10 @@ com.engine.render.SpriteBatch.prototype = $extend(com.engine.render.Buffer.proto ,flush: function() { if(this.currentBatchSize == 0) return; this.update(); - this.currentBaseTexture.Bind(); + this.shader.setTexture(this.currentBaseTexture); this.numTex++; - openfl.gl.GL.uniformMatrix4fv(this.shader.projectionMatrixUniform,false,new Float32Array(com.engine.game.Game.projMatrix.m)); - openfl.gl.GL.uniformMatrix4fv(this.shader.modelViewMatrixUniform,false,new Float32Array(this.viewMatrix.m)); - openfl.gl.GL.uniform1i(this.shader.imageUniform,0); + openfl.gl.GL.uniformMatrix3D(this.shader.projectionMatrixUniform,false,com.engine.game.Game.camera.projMatrix); + openfl.gl.GL.uniformMatrix3D(this.shader.modelViewMatrixUniform,false,this.viewMatrix); openfl.gl.GL.bufferSubData(34962,0,this.vertices); openfl.gl.GL.bindBuffer(34963,this.indexBuffer); openfl.gl.GL.drawElements(4,this.currentBatchSize * 6,5123,0); @@ -3821,11 +3206,10 @@ com.engine.render.SpriteBatch.prototype = $extend(com.engine.render.Buffer.proto } ,start: function() { this.shader.Enable(); - openfl.gl.GL.activeTexture(33984); openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); - openfl.gl.GL.vertexAttribPointer(this.shader.vertexAttribute,3,5126,false,this.vertexStrideSize,0); - openfl.gl.GL.vertexAttribPointer(this.shader.texCoordAttribute,2,5126,false,this.vertexStrideSize,12); - openfl.gl.GL.vertexAttribPointer(this.shader.colorAttribute,4,5126,false,this.vertexStrideSize,20); + openfl.gl.GL.vertexAttribPointer(com.engine.render.filter.Filter.vertexAttribute,3,5126,false,this.vertexStrideSize,0); + openfl.gl.GL.vertexAttribPointer(com.engine.render.filter.Filter.texCoordAttribute,2,5126,false,this.vertexStrideSize,12); + openfl.gl.GL.vertexAttribPointer(com.engine.render.filter.Filter.colorAttribute,4,5126,false,this.vertexStrideSize,20); if(this.currentBlendMode != com.engine.render.BlendMode.NORMAL) this.setBlendMode(this.currentBlendMode); } ,End: function() { @@ -3836,6 +3220,8 @@ com.engine.render.SpriteBatch.prototype = $extend(com.engine.render.Buffer.proto this.numTex = 0; this.numBlend = 0; this.currentBatchSize = 0; + this.currentBaseTexture = null; + this.currentBlendMode = -1; this.start(); } ,RenderNormal: function(texture,x,y,blendMode) { @@ -4121,78 +3507,89 @@ com.engine.render.SpriteBatch.prototype = $extend(com.engine.render.Buffer.proto this.vertices[index++] = 1; this.currentBatchSize++; } - ,drawEntity: function(obj) { - if(obj.image != this.currentBaseTexture || this.currentBatchSize >= this.capacity) this.switchTexture(obj.image); - if(obj.blendMode != this.currentBlendMode) this.setBlendMode(obj.blendMode); - var u = obj.clip.x * this.invTexWidth; - var u2 = (obj.clip.x + obj.clip.width) * this.invTexWidth; - var v = (obj.clip.y + obj.clip.height) * this.invTexHeight; - var v2 = obj.clip.y * this.invTexHeight; - if(obj.flipx) { - var tmp = u; - u = u2; - u2 = tmp; - } - if(obj.flipy) { - var tmp = v; - v = v2; - v2 = tmp; - } - var index = this.currentBatchSize * this.vertexStrideSize; - var TempX1 = 0; - var TempY1 = 0; - var TempX2 = obj.clip.width; - var TempY2 = obj.clip.height; - var r = obj.red; - var g = obj.green; - var b = obj.blue; - var a = obj.alpha; - this.vertices[index + 2] = obj.depth; - this.vertices[index + 9 + 2] = obj.depth; - this.vertices[index + 18 + 2] = obj.depth; - this.vertices[index + 27 + 2] = obj.depth; - this.vertices[index] = TempX1; - this.vertices[index + 1] = TempY1; - this.vertices[index + 9] = TempX1; - this.vertices[index + 9 + 1] = TempY2; - this.vertices[index + 18] = TempX2; - this.vertices[index + 18 + 1] = TempX2; - this.vertices[index + 27] = TempX2; - this.vertices[index + 27 + 1] = TempY1; - this.vertices[index + 3] = u; - this.vertices[index + 4] = v2; - this.vertices[index + 9 + 3] = u; - this.vertices[index + 9 + 4] = v; - this.vertices[index + 18 + 3] = u2; - this.vertices[index + 18 + 4] = v; - this.vertices[index + 27 + 3] = u2; - this.vertices[index + 27 + 4] = v2; - this.vertices[index + 5] = r; - this.vertices[index + 6] = g; - this.vertices[index + 7] = b; - this.vertices[index + 8] = a; - this.vertices[index + 9 + 5] = r; - this.vertices[index + 9 + 6] = g; - this.vertices[index + 9 + 7] = b; - this.vertices[index + 9 + 8] = a; - this.vertices[index + 18 + 5] = r; - this.vertices[index + 18 + 6] = g; - this.vertices[index + 18 + 7] = b; - this.vertices[index + 18 + 8] = a; - this.vertices[index + 27 + 5] = r; - this.vertices[index + 27 + 6] = g; - this.vertices[index + 27 + 7] = b; - this.vertices[index + 27 + 8] = a; + ,drawEntity: function(obj,childs) { + if(childs == null) childs = false; var matrix = obj.getLocalToWorldMatrix(); - var _g = 0; - while(_g < 4) { - var i = _g++; - var x = this.vertices[index + i * 9]; - var y = this.vertices[index + i * 9 + 1]; - this.vertices[index + i * 9] = matrix.a * x + matrix.c * y + matrix.tx; - this.vertices[index + i * 9 + 1] = matrix.d * y + matrix.b * x + matrix.ty; + if(obj.image != null) { + if(obj.image != this.currentBaseTexture) this.switchTexture(obj.image); + if(obj.blendMode != this.currentBlendMode) this.setBlendMode(obj.blendMode); + var u = obj.clip.x * this.invTexWidth; + var u2 = (obj.clip.x + obj.clip.width) * this.invTexWidth; + var v = (obj.clip.y + obj.clip.height) * this.invTexHeight; + var v2 = obj.clip.y * this.invTexHeight; + if(obj.flipx) { + var tmp = u; + u = u2; + u2 = tmp; + } + if(obj.flipy) { + var tmp = v; + v = v2; + v2 = tmp; + } + var index = this.currentBatchSize * this.vertexStrideSize; + var TempX1 = 0; + var TempY1 = 0; + var TempX2 = obj.clip.width; + var TempY2 = obj.clip.height; + var r = obj.red; + var g = obj.green; + var b = obj.blue; + var a = obj.alpha; + this.vertices[index + 2] = obj.depth; + this.vertices[index + 9 + 2] = obj.depth; + this.vertices[index + 18 + 2] = obj.depth; + this.vertices[index + 27 + 2] = obj.depth; + this.vertices[index] = TempX1; + this.vertices[index + 1] = TempY1; + this.vertices[index + 9] = TempX1; + this.vertices[index + 9 + 1] = TempY2; + this.vertices[index + 18] = TempX2; + this.vertices[index + 18 + 1] = TempX2; + this.vertices[index + 27] = TempX2; + this.vertices[index + 27 + 1] = TempY1; + this.vertices[index + 3] = u; + this.vertices[index + 4] = v2; + this.vertices[index + 9 + 3] = u; + this.vertices[index + 9 + 4] = v; + this.vertices[index + 18 + 3] = u2; + this.vertices[index + 18 + 4] = v; + this.vertices[index + 27 + 3] = u2; + this.vertices[index + 27 + 4] = v2; + this.vertices[index + 5] = r; + this.vertices[index + 6] = g; + this.vertices[index + 7] = b; + this.vertices[index + 8] = a; + this.vertices[index + 9 + 5] = r; + this.vertices[index + 9 + 6] = g; + this.vertices[index + 9 + 7] = b; + this.vertices[index + 9 + 8] = a; + this.vertices[index + 18 + 5] = r; + this.vertices[index + 18 + 6] = g; + this.vertices[index + 18 + 7] = b; + this.vertices[index + 18 + 8] = a; + this.vertices[index + 27 + 5] = r; + this.vertices[index + 27 + 6] = g; + this.vertices[index + 27 + 7] = b; + this.vertices[index + 27 + 8] = a; + var _g = 0; + while(_g < 4) { + var i = _g++; + var x = this.vertices[index + i * 9]; + var y = this.vertices[index + i * 9 + 1]; + this.vertices[index + i * 9] = matrix.a * x + matrix.c * y + matrix.tx; + this.vertices[index + i * 9 + 1] = matrix.d * y + matrix.b * x + matrix.ty; + } + this.currentBatchSize++; + } + if(childs == true) { + var _g1 = 0, _g = obj.children.length; + while(_g1 < _g) { + var i = _g1++; + var o = obj.children[i]; + this.drawEntity(o); + } } - this.currentBatchSize++; } ,drawEntitys: function(obj) { var _g1 = 0, _g = obj.children.length; @@ -4382,14 +3779,12 @@ com.engine.render.SpriteBatch.prototype = $extend(com.engine.render.Buffer.proto ,__class__: com.engine.render.SpriteBatch }); com.engine.render.SpriteShader = function() { - var vertexShaderSource = "\r\nattribute vec3 aVertexPosition;\r\nattribute vec2 aTexCoord;\r\nattribute vec4 aColor;\r\n\r\nvarying vec2 vTexCoord;\r\nvarying vec4 vColor;\r\n\r\nuniform mat4 uModelViewMatrix;\r\nuniform mat4 uProjectionMatrix;\r\nvoid main(void) \r\n{\r\nvTexCoord = aTexCoord;\r\nvColor = aColor;\r\ngl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0);\r\n\r\n}"; var vertexShader = openfl.gl.GL.createShader(35633); - openfl.gl.GL.shaderSource(vertexShader,vertexShaderSource); + openfl.gl.GL.shaderSource(vertexShader,com.engine.render.filter.Filter.textureVertexShader); openfl.gl.GL.compileShader(vertexShader); if(openfl.gl.GL.getShaderParameter(vertexShader,35713) == 0) throw openfl.gl.GL.getShaderInfoLog(vertexShader); - var fragmentShaderSource = "precision mediump float;" + "\r\nvarying vec2 vTexCoord;\r\nvarying vec4 vColor;\r\nuniform sampler2D uImage0;\r\n\r\nvoid main(void)\r\n{\r\n\tgl_FragColor = texture2D (uImage0, vTexCoord) * vColor;\r\n\r\n}"; var fragmentShader = openfl.gl.GL.createShader(35632); - openfl.gl.GL.shaderSource(fragmentShader,fragmentShaderSource); + openfl.gl.GL.shaderSource(fragmentShader,com.engine.render.filter.Filter.textureFragmentShader); openfl.gl.GL.compileShader(fragmentShader); if(openfl.gl.GL.getShaderParameter(fragmentShader,35713) == 0) throw openfl.gl.GL.getShaderInfoLog(fragmentShader); this.shaderProgram = openfl.gl.GL.createProgram(); @@ -4397,9 +3792,9 @@ com.engine.render.SpriteShader = function() { openfl.gl.GL.attachShader(this.shaderProgram,fragmentShader); openfl.gl.GL.linkProgram(this.shaderProgram); if(openfl.gl.GL.getProgramParameter(this.shaderProgram,35714) == 0) throw "Unable to initialize the shader program."; - this.vertexAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aVertexPosition"); - this.texCoordAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aTexCoord"); - this.colorAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aColor"); + com.engine.render.filter.Filter.vertexAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aVertexPosition"); + com.engine.render.filter.Filter.texCoordAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aTexCoord"); + com.engine.render.filter.Filter.colorAttribute = openfl.gl.GL.getAttribLocation(this.shaderProgram,"aColor"); this.projectionMatrixUniform = openfl.gl.GL.getUniformLocation(this.shaderProgram,"uProjectionMatrix"); this.modelViewMatrixUniform = openfl.gl.GL.getUniformLocation(this.shaderProgram,"uModelViewMatrix"); this.imageUniform = openfl.gl.GL.getUniformLocation(this.shaderProgram,"uImage0"); @@ -4407,3571 +3802,3870 @@ com.engine.render.SpriteShader = function() { $hxClasses["com.engine.render.SpriteShader"] = com.engine.render.SpriteShader; com.engine.render.SpriteShader.__name__ = ["com","engine","render","SpriteShader"]; com.engine.render.SpriteShader.prototype = { - Disable: function() { - openfl.gl.GL.disableVertexAttribArray(this.vertexAttribute); - openfl.gl.GL.disableVertexAttribArray(this.texCoordAttribute); - openfl.gl.GL.disableVertexAttribArray(this.colorAttribute); + setMatrix: function() { + openfl.gl.GL.uniformMatrix3D(this.projectionMatrixUniform,false,com.engine.game.Game.camera.projMatrix); + openfl.gl.GL.uniformMatrix3D(this.modelViewMatrixUniform,false,com.engine.game.Game.camera.viewMatrix); + } + ,setTexture: function(tex) { + tex.Bind(); + openfl.gl.GL.uniform1i(this.imageUniform,0); + } + ,dispose: function() { + openfl.gl.GL.deleteProgram(this.shaderProgram); + } + ,Disable: function() { + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.vertexAttribute); + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.texCoordAttribute); + openfl.gl.GL.disableVertexAttribArray(com.engine.render.filter.Filter.colorAttribute); + openfl.gl.GL.useProgram(null); } ,Enable: function() { openfl.gl.GL.useProgram(this.shaderProgram); - openfl.gl.GL.enableVertexAttribArray(this.vertexAttribute); - openfl.gl.GL.enableVertexAttribArray(this.texCoordAttribute); - openfl.gl.GL.enableVertexAttribArray(this.colorAttribute); + openfl.gl.GL.enableVertexAttribArray(com.engine.render.filter.Filter.vertexAttribute); + openfl.gl.GL.enableVertexAttribArray(com.engine.render.filter.Filter.texCoordAttribute); + openfl.gl.GL.enableVertexAttribArray(com.engine.render.filter.Filter.colorAttribute); } ,__class__: com.engine.render.SpriteShader } -com.engine.render.Texture = function(url,flip) { - if(flip == null) flip = false; - this.bitmapData = openfl.Assets.getBitmapData(url); - if(flip) this.bitmapData = com.engine.misc.MatrixHelp.flipBitmapData(this.bitmapData,null); - this.data = openfl.gl.GL.createTexture(); - openfl.gl.GL.bindTexture(3553,this.data); - this.width = this.bitmapData.get_width(); - this.height = this.bitmapData.get_height(); - this.texWidth = com.engine.misc.Util.getNextPowerOfTwo(this.width); - this.texHeight = com.engine.misc.Util.getNextPowerOfTwo(this.height); - var isPot = this.bitmapData.get_width() == this.texWidth && this.bitmapData.get_height() == this.texHeight; - openfl.gl.GL.texParameteri(3553,10242,33071); - openfl.gl.GL.texParameteri(3553,10243,33071); - openfl.gl.GL.texParameteri(3553,10240,9728); - openfl.gl.GL.texParameteri(3553,10241,9728); - if(!isPot) { - var workingCanvas = com.engine.misc.MatrixHelp.getScaled(this.bitmapData,this.texWidth,this.texHeight); - this.bitmapData = null; - var pixelData = workingCanvas.getPixels(workingCanvas.rect).byteView; - openfl.gl.GL.texImage2D(3553,0,6408,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.width:0,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.height:0,0,6408,5121,pixelData); - console.log((workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.width:0) + "<>" + (workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.height:0)); - } else { - var pixelData = this.bitmapData.getPixels(this.bitmapData.rect).byteView; - openfl.gl.GL.texImage2D(3553,0,6408,this.texWidth,this.texHeight,0,6408,5121,pixelData); - } +com.engine.render.Texture = function() { + this.width = 0; + this.height = 0; + this.texWidth = 0; + this.texHeight = 0; + this.exists = false; }; $hxClasses["com.engine.render.Texture"] = com.engine.render.Texture; com.engine.render.Texture.__name__ = ["com","engine","render","Texture"]; com.engine.render.Texture.prototype = { - Bind: function() { + dispose: function() { + openfl.gl.GL.deleteTexture(this.data); + } + ,load: function(url,flip) { + if(flip == null) flip = false; + this.name = url; + var bitmapData; + bitmapData = openfl.Assets.getBitmapData(url); + if(bitmapData == null) return; + if(flip) bitmapData = com.engine.misc.Util.flipBitmapData(bitmapData,null); + this.data = openfl.gl.GL.createTexture(); + openfl.gl.GL.bindTexture(3553,this.data); + this.width = bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0; + this.height = bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0; + this.texWidth = com.engine.misc.Util.getNextPowerOfTwo(this.width); + this.texHeight = com.engine.misc.Util.getNextPowerOfTwo(this.height); + var isPot = (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0) == this.texWidth && (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0) == this.texHeight; + openfl.gl.GL.texParameteri(3553,10242,33071); + openfl.gl.GL.texParameteri(3553,10243,33071); + openfl.gl.GL.texParameteri(3553,10240,9728); + openfl.gl.GL.texParameteri(3553,10241,9728); + if(!isPot) { + var workingCanvas = com.engine.misc.Util.getScaled(bitmapData,this.texWidth,this.texHeight); + var pixelData = workingCanvas.getPixels(workingCanvas.rect).byteView; + openfl.gl.GL.texImage2D(3553,0,6408,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.width:0,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.height:0,0,6408,5121,pixelData); + } else { + var pixelData = bitmapData.getPixels(bitmapData.rect).byteView; + openfl.gl.GL.texImage2D(3553,0,6408,this.texWidth,this.texHeight,0,6408,5121,pixelData); + } + this.invTexWidth = 1.0 / this.texWidth; + this.invTexHeight = 1.0 / this.texHeight; + this.exists = true; + } + ,setData: function(bitmapData,flip,newname) { + if(newname == null) newname = "bitmap"; + if(flip == null) flip = false; + this.exists = false; + if(bitmapData == null) return; + this.name = newname; + if(flip) bitmapData = com.engine.misc.Util.flipBitmapData(bitmapData,null); + this.data = openfl.gl.GL.createTexture(); + openfl.gl.GL.bindTexture(3553,this.data); + this.width = bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0; + this.height = bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0; + this.texWidth = com.engine.misc.Util.getNextPowerOfTwo(this.width); + this.texHeight = com.engine.misc.Util.getNextPowerOfTwo(this.height); + var isPot = (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0) == this.texWidth && (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0) == this.texHeight; + openfl.gl.GL.texParameteri(3553,10242,33071); + openfl.gl.GL.texParameteri(3553,10243,33071); + openfl.gl.GL.texParameteri(3553,10240,9728); + openfl.gl.GL.texParameteri(3553,10241,9728); + if(!isPot) { + var workingCanvas = com.engine.misc.Util.getScaled(bitmapData,this.texWidth,this.texHeight); + var pixelData = workingCanvas.getPixels(workingCanvas.rect).byteView; + openfl.gl.GL.texImage2D(3553,0,6408,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.width:0,workingCanvas.___textureBuffer != null?workingCanvas.___textureBuffer.height:0,0,6408,5121,pixelData); + } else { + var pixelData = bitmapData.getPixels(bitmapData.rect).byteView; + openfl.gl.GL.texImage2D(3553,0,6408,this.texWidth,this.texHeight,0,6408,5121,pixelData); + } + this.invTexWidth = 1.0 / this.texWidth; + this.invTexHeight = 1.0 / this.texHeight; + this.exists = true; + } + ,Bind: function() { + if(!this.exists) return; openfl.gl.GL.bindTexture(3553,this.data); } ,__class__: com.engine.render.Texture } -var haxe = {} -haxe.Timer = function() { } -$hxClasses["haxe.Timer"] = haxe.Timer; -haxe.Timer.__name__ = ["haxe","Timer"]; -haxe.Timer.stamp = function() { - return new Date().getTime() / 1000; -} -flash.Lib = function(rootElement,width,height) { - this.mKilled = false; - this.__scr = rootElement; - if(this.__scr == null) throw "Root element not found"; - this.__scr.style.setProperty("overflow","hidden",""); - this.__scr.style.setProperty("position","absolute",""); - if(this.__scr.style.getPropertyValue("width") != "100%") this.__scr.style.width = width + "px"; - if(this.__scr.style.getPropertyValue("height") != "100%") this.__scr.style.height = height + "px"; +com.engine.render.filter = {} +com.engine.render.filter.RenderFilter = function(width,height) { + this.width = width; + this.height = height; + this.framebuffer = openfl.gl.GL.createFramebuffer(); + openfl.gl.GL.bindFramebuffer(36160,this.framebuffer); + this.texture = openfl.gl.GL.createTexture(); + openfl.gl.GL.bindTexture(3553,this.texture); + openfl.gl.GL.texParameteri(3553,10240,9729); + openfl.gl.GL.texParameteri(3553,10241,9729); + openfl.gl.GL.texParameteri(3553,10242,33071); + openfl.gl.GL.texParameteri(3553,10243,33071); + openfl.gl.GL.texImage2D(3553,0,6408,width,height,0,6408,5121,null); + openfl.gl.GL.bindFramebuffer(36160,this.framebuffer); + openfl.gl.GL.framebufferTexture2D(36160,36064,3553,this.texture,0); + openfl.gl.GL.bindFramebuffer(36160,null); + var vertices = [width,height,0,0,height,0,width,0,0,0,0,0]; + this.vertexBuffer = openfl.gl.GL.createBuffer(); + openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); + openfl.gl.GL.bufferData(34962,new Float32Array(vertices),35044); + var texCoords = [1,0,0,0,1,1,0,1]; + this.texCoordBuffer = openfl.gl.GL.createBuffer(); + openfl.gl.GL.bindBuffer(34962,this.texCoordBuffer); + openfl.gl.GL.bufferData(34962,new Float32Array(texCoords),35044); + var vertexShaderSource = "attribute vec3 aVertexPosition;\r\n\t\t\tattribute vec2 aTexCoord;\r\n\t\t\tvarying vec2 vTexCoord;\r\n\t\t\t\r\n\t\t\tuniform mat4 uModelViewMatrix;\r\n\t\t\tuniform mat4 uProjectionMatrix;\r\n\t\t\t\r\n\t\t\tvoid main(void) {\r\n\t\t\t\tvTexCoord = aTexCoord;\r\n\t\t\t\tgl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0);\r\n\t\t\t}"; + var vertexShader = openfl.gl.GL.createShader(35633); + openfl.gl.GL.shaderSource(vertexShader,vertexShaderSource); + openfl.gl.GL.compileShader(vertexShader); + if(openfl.gl.GL.getShaderParameter(vertexShader,35713) == 0) throw "Error compiling vertex shader"; + var fragmentShader = openfl.gl.GL.createShader(35632); + openfl.gl.GL.shaderSource(fragmentShader,this.getFragment()); + openfl.gl.GL.compileShader(fragmentShader); + if(openfl.gl.GL.getShaderParameter(fragmentShader,35713) == 0) throw "Error compiling fragment shader"; + this.shader = openfl.gl.GL.createProgram(); + openfl.gl.GL.attachShader(this.shader,vertexShader); + openfl.gl.GL.attachShader(this.shader,fragmentShader); + openfl.gl.GL.linkProgram(this.shader); + if(openfl.gl.GL.getProgramParameter(this.shader,35714) == 0) throw "Unable to initialize the shader program."; + this.vertexAttribute = openfl.gl.GL.getAttribLocation(this.shader,"aVertexPosition"); + this.texCoordAttribute = openfl.gl.GL.getAttribLocation(this.shader,"aTexCoord"); + this.projectionMatrixUniform = openfl.gl.GL.getUniformLocation(this.shader,"uProjectionMatrix"); + this.modelViewMatrixUniform = openfl.gl.GL.getUniformLocation(this.shader,"uModelViewMatrix"); + this.imageUniform = openfl.gl.GL.getUniformLocation(this.shader,"uImage0"); + this.getUnifom(); }; -$hxClasses["flash.Lib"] = flash.Lib; -flash.Lib.__name__ = ["flash","Lib"]; -flash.Lib.__properties__ = {get_current:"get_current"} -flash.Lib.addCallback = function(functionName,closure) { - flash.Lib.mMe.__scr[functionName] = closure; -} -flash.Lib["as"] = function(v,c) { - return js.Boot.__instanceof(v,c)?v:null; -} -flash.Lib.attach = function(name) { - return new flash.display.MovieClip(); -} -flash.Lib.getTimer = function() { - return (haxe.Timer.stamp() - flash.Lib.starttime) * 1000 | 0; -} -flash.Lib.getURL = function(request,target) { - if(target == null) target = "_blank"; - window.open(request.url,target); -} -flash.Lib.preventDefaultTouchMove = function() { - js.Browser.document.addEventListener("touchmove",function(evt) { - evt.preventDefault(); - },false); -} -flash.Lib.Run = function(tgt,width,height) { - flash.Lib.mMe = new flash.Lib(tgt,width,height); - var _g1 = 0, _g = tgt.attributes.length; - while(_g1 < _g) { - var i = _g1++; - var attr = tgt.attributes.item(i); - if(StringTools.startsWith(attr.name,"data-")) { - if(attr.name == "data-" + "framerate") flash.Lib.__getStage().set_frameRate(Std.parseFloat(attr.value)); - } +$hxClasses["com.engine.render.filter.RenderFilter"] = com.engine.render.filter.RenderFilter; +com.engine.render.filter.RenderFilter.__name__ = ["com","engine","render","filter","RenderFilter"]; +com.engine.render.filter.RenderFilter.prototype = { + dispose: function() { + openfl.gl.GL.deleteProgram(this.shader); + openfl.gl.GL.deleteBuffer(this.vertexBuffer); + openfl.gl.GL.deleteBuffer(this.texCoordBuffer); + openfl.gl.GL.deleteTexture(this.texture); } - var _g = 0, _g1 = flash.Lib.HTML_TOUCH_EVENT_TYPES; - while(_g < _g1.length) { - var type = _g1[_g]; - ++_g; - tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + ,render: function() { + openfl.gl.GL.useProgram(this.shader); + openfl.gl.GL.enableVertexAttribArray(this.vertexAttribute); + openfl.gl.GL.enableVertexAttribArray(this.texCoordAttribute); + openfl.gl.GL.bindTexture(3553,this.texture); + openfl.gl.GL.bindBuffer(34962,this.vertexBuffer); + openfl.gl.GL.vertexAttribPointer(this.vertexAttribute,3,5126,false,0,0); + openfl.gl.GL.bindBuffer(34962,this.texCoordBuffer); + openfl.gl.GL.vertexAttribPointer(this.texCoordAttribute,2,5126,false,0,0); + openfl.gl.GL.uniformMatrix3D(this.projectionMatrixUniform,false,com.engine.game.Game.camera.projMatrix); + openfl.gl.GL.uniformMatrix3D(this.modelViewMatrixUniform,false,com.engine.game.Game.camera.viewMatrix); + openfl.gl.GL.uniform1i(this.imageUniform,0); + this.setUnifom(); + openfl.gl.GL.drawArrays(5,0,4); } - var _g = 0, _g1 = flash.Lib.HTML_TOUCH_ALT_EVENT_TYPES; - while(_g < _g1.length) { - var type = _g1[_g]; - ++_g; - tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + ,end: function() { + openfl.gl.GL.bindFramebuffer(36160,null); } - var _g = 0, _g1 = flash.Lib.HTML_DIV_EVENT_TYPES; - while(_g < _g1.length) { - var type = _g1[_g]; - ++_g; - tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + ,begin: function() { + openfl.gl.GL.colorMask(true,true,true,true); + openfl.gl.GL.viewport(0,0,this.width,this.height); + openfl.gl.GL.bindFramebuffer(36160,this.framebuffer); + openfl.gl.GL.clear(16384); } - if(Reflect.hasField(js.Browser.window,"on" + "devicemotion")) js.Browser.window.addEventListener("devicemotion",($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); - if(Reflect.hasField(js.Browser.window,"on" + "orientationchange")) js.Browser.window.addEventListener("orientationchange",($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); - var _g = 0, _g1 = flash.Lib.HTML_WINDOW_EVENT_TYPES; - while(_g < _g1.length) { - var type = _g1[_g]; - ++_g; - js.Browser.window.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),false); + ,setUnifom: function() { } - if(tgt.style.backgroundColor != null && tgt.style.backgroundColor != "") flash.Lib.__getStage().set_backgroundColor(flash.Lib.__parseColor(tgt.style.backgroundColor,function(res,pos,cur) { - return pos == 0?res | cur << 16:pos == 1?res | cur << 8:pos == 2?res | cur:(function($this) { - var $r; - throw "pos should be 0-2"; - return $r; - }(this)); - })); else flash.Lib.__getStage().set_backgroundColor(16777215); - flash.Lib.get_current().get_graphics().beginFill(flash.Lib.__getStage().get_backgroundColor()); - flash.Lib.get_current().get_graphics().drawRect(0,0,width,height); - flash.Lib.__setSurfaceId(flash.Lib.get_current().get_graphics().__surface,"Root MovieClip"); - flash.Lib.__getStage().__updateNextWake(); - return flash.Lib.mMe; -} -flash.Lib.setUserScalable = function(isScalable) { - if(isScalable == null) isScalable = true; - var meta = js.Browser.document.createElement("meta"); - meta.name = "viewport"; - meta.content = "user-scalable=" + (isScalable?"yes":"no"); -} -flash.Lib.trace = function(arg) { - if(window.console != null) window.console.log(arg); -} -flash.Lib.__appendSurface = function(surface,before,after) { - if(flash.Lib.mMe.__scr != null) { - surface.style.setProperty("position","absolute",""); - surface.style.setProperty("left","0px",""); - surface.style.setProperty("top","0px",""); - surface.style.setProperty("transform-origin","0 0",""); - surface.style.setProperty("-moz-transform-origin","0 0",""); - surface.style.setProperty("-webkit-transform-origin","0 0",""); - surface.style.setProperty("-o-transform-origin","0 0",""); - surface.style.setProperty("-ms-transform-origin","0 0",""); - try { - if(surface.localName == "canvas") surface.onmouseover = surface.onselectstart = function() { - return false; - }; - } catch( e ) { - } - if(before != null) before.parentNode.insertBefore(surface,before); else if(after != null && after.nextSibling != null) after.parentNode.insertBefore(surface,after.nextSibling); else flash.Lib.mMe.__scr.appendChild(surface); + ,getUnifom: function() { } -} -flash.Lib.__appendText = function(surface,container,text,wrap,isHtml) { - var _g1 = 0, _g = surface.childNodes.length; - while(_g1 < _g) { - var i = _g1++; - surface.removeChild(surface.childNodes[i]); + ,getFragment: function() { + return ""; } - if(isHtml) container.innerHTML = text; else container.appendChild(js.Browser.document.createTextNode(text)); - container.style.setProperty("position","relative",""); - container.style.setProperty("cursor","default",""); - if(!wrap) container.style.setProperty("white-space","nowrap",""); - surface.appendChild(container); + ,__class__: com.engine.render.filter.RenderFilter } -flash.Lib.__bootstrap = function() { - if(flash.Lib.mMe == null) { - var target = js.Browser.document.getElementById("haxe:openfl"); - if(target == null) target = js.Browser.document.createElement("div"); - var agent = navigator.userAgent; - if(agent.indexOf("BlackBerry") > -1 && target.style.height == "100%") target.style.height = screen.height + "px"; - if(agent.indexOf("Android") > -1) { - var version = Std.parseFloat(HxOverrides.substr(agent,agent.indexOf("Android") + 8,3)); - if(version <= 2.3) flash.Lib.mForce2DTransform = true; - } - flash.Lib.Run(target,flash.Lib.__getWidth(),flash.Lib.__getHeight()); +com.engine.render.filter.BlurFilter = function(width,height) { + this.blur = 0.001953125; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.BlurFilter"] = com.engine.render.filter.BlurFilter; +com.engine.render.filter.BlurFilter.__name__ = ["com","engine","render","filter","BlurFilter"]; +com.engine.render.filter.BlurFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.BlurFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setBlur: function(v) { + this.blur = v / (1 / 7000); } -} -flash.Lib.__copyStyle = function(src,tgt) { - tgt.id = src.id; - var _g = 0, _g1 = ["left","top","transform","transform-origin","-moz-transform","-moz-transform-origin","-webkit-transform","-webkit-transform-origin","-o-transform","-o-transform-origin","opacity","display"]; - while(_g < _g1.length) { - var prop = _g1[_g]; - ++_g; - tgt.style.setProperty(prop,src.style.getPropertyValue(prop),""); + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.blurUniform,this.blur); } -} -flash.Lib.__createSurfaceAnimationCSS = function(surface,data,template,templateFunc,fps,discrete,infinite) { - if(infinite == null) infinite = false; - if(discrete == null) discrete = false; - if(fps == null) fps = 25; - if(surface.id == null || surface.id == "") { - flash.Lib.trace("Failed to create a CSS Style tag for a surface without an id attribute"); - return null; + ,getUnifom: function() { + this.blurUniform = openfl.gl.GL.getUniformLocation(this.shader,"blur"); } - var style = null; - if(surface.getAttribute("data-openfl-anim") != null) style = js.Browser.document.getElementById(surface.getAttribute("data-openfl-anim")); else { - style = flash.Lib.mMe.__scr.appendChild(js.Browser.document.createElement("style")); - style.sheet.id = "__openfl_anim_" + surface.id + "__"; - surface.setAttribute("data-openfl-anim",style.sheet.id); + ,getFragment: function() { + return com.engine.render.filter.Filter.blurXFilter; } - var keyframeStylesheetRule = ""; - var _g1 = 0, _g = data.length; - while(_g1 < _g) { - var i = _g1++; - var perc = i / (data.length - 1) * 100; - var frame = data[i]; - keyframeStylesheetRule += perc + "% { " + template.execute(templateFunc(frame)) + " } "; + ,__class__: com.engine.render.filter.BlurFilter +}); +com.engine.render.filter.BlurXFilter = function(width,height) { + this.blur = 0.001953125; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.BlurXFilter"] = com.engine.render.filter.BlurXFilter; +com.engine.render.filter.BlurXFilter.__name__ = ["com","engine","render","filter","BlurXFilter"]; +com.engine.render.filter.BlurXFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.BlurXFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setBlur: function(v) { + this.blur = v / (1 / 7000); } - var animationDiscreteRule = discrete?"steps(::steps::, end)":""; - var animationInfiniteRule = infinite?"infinite":""; - var animationTpl = ""; - var _g = 0, _g1 = ["animation","-moz-animation","-webkit-animation","-o-animation","-ms-animation"]; - while(_g < _g1.length) { - var prefix = _g1[_g]; - ++_g; - animationTpl += prefix + ": ::id:: ::duration::s " + animationDiscreteRule + " " + animationInfiniteRule + "; "; + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.blurUniform,this.blur); } - var animationStylesheetRule = new haxe.Template(animationTpl).execute({ id : surface.id, duration : data.length / fps, steps : 1}); - var rules = style.sheet.rules != null?style.sheet.rules:style.sheet.cssRules; - var _g = 0, _g1 = ["","-moz-","-webkit-","-o-","-ms-"]; - while(_g < _g1.length) { - var variant = _g1[_g]; - ++_g; - try { - style.sheet.insertRule("@" + variant + "keyframes " + surface.id + " {" + keyframeStylesheetRule + "}",rules.length); - } catch( e ) { - } + ,getUnifom: function() { + this.blurUniform = openfl.gl.GL.getUniformLocation(this.shader,"blur"); } - style.sheet.insertRule("#" + surface.id + " { " + animationStylesheetRule + " } ",rules.length); - return style; -} -flash.Lib.__designMode = function(mode) { - js.Browser.document.designMode = mode?"on":"off"; -} -flash.Lib.__disableFullScreen = function() { -} -flash.Lib.__disableRightClick = function() { - if(flash.Lib.mMe != null) try { - flash.Lib.mMe.__scr.oncontextmenu = function() { - return false; - }; - } catch( e ) { - flash.Lib.trace("Disable right click not supported in this browser."); + ,getFragment: function() { + return com.engine.render.filter.Filter.blurXFilter; } -} -flash.Lib.__drawClippedImage = function(surface,tgtCtx,clipRect) { - if(clipRect != null) { - if(clipRect.x < 0) { - clipRect.width += clipRect.x; - clipRect.x = 0; - } - if(clipRect.y < 0) { - clipRect.height += clipRect.y; - clipRect.y = 0; - } - if(clipRect.width > surface.width - clipRect.x) clipRect.width = surface.width - clipRect.x; - if(clipRect.height > surface.height - clipRect.y) clipRect.height = surface.height - clipRect.y; - tgtCtx.drawImage(surface,clipRect.x,clipRect.y,clipRect.width,clipRect.height,clipRect.x,clipRect.y,clipRect.width,clipRect.height); - } else tgtCtx.drawImage(surface,0,0); -} -flash.Lib.__drawSurfaceRect = function(surface,tgt,x,y,rect) { - var tgtCtx = tgt.getContext("2d"); - tgt.width = rect.width; - tgt.height = rect.height; - tgtCtx.drawImage(surface,rect.x,rect.y,rect.width,rect.height,0,0,rect.width,rect.height); - tgt.style.left = x + "px"; - tgt.style.top = y + "px"; -} -flash.Lib.__drawToSurface = function(surface,tgt,matrix,alpha,clipRect,smoothing) { - if(smoothing == null) smoothing = true; - if(alpha == null) alpha = 1.0; - var srcCtx = surface.getContext("2d"); - var tgtCtx = tgt.getContext("2d"); - tgtCtx.globalAlpha = alpha; - flash.Lib.__setImageSmoothing(tgtCtx,smoothing); - if(surface.width > 0 && surface.height > 0) { - if(matrix != null) { - tgtCtx.save(); - if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1) tgtCtx.translate(matrix.tx,matrix.ty); else tgtCtx.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.tx,matrix.ty); - flash.Lib.__drawClippedImage(surface,tgtCtx,clipRect); - tgtCtx.restore(); - } else flash.Lib.__drawClippedImage(surface,tgtCtx,clipRect); + ,__class__: com.engine.render.filter.BlurXFilter +}); +com.engine.render.filter.BlurYFilter = function(width,height) { + this.blur = 0.001953125; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.BlurYFilter"] = com.engine.render.filter.BlurYFilter; +com.engine.render.filter.BlurYFilter.__name__ = ["com","engine","render","filter","BlurYFilter"]; +com.engine.render.filter.BlurYFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.BlurYFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setBlur: function(v) { + this.blur = v / (1 / 7000); } -} -flash.Lib.__enableFullScreen = function() { - if(flash.Lib.mMe != null) { - var origWidth = flash.Lib.mMe.__scr.style.getPropertyValue("width"); - var origHeight = flash.Lib.mMe.__scr.style.getPropertyValue("height"); - flash.Lib.mMe.__scr.style.setProperty("width","100%",""); - flash.Lib.mMe.__scr.style.setProperty("height","100%",""); - flash.Lib.__disableFullScreen = function() { - flash.Lib.mMe.__scr.style.setProperty("width",origWidth,""); - flash.Lib.mMe.__scr.style.setProperty("height",origHeight,""); - }; + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.blurUniform,this.blur); } -} -flash.Lib.__enableRightClick = function() { - if(flash.Lib.mMe != null) try { - flash.Lib.mMe.__scr.oncontextmenu = null; - } catch( e ) { - flash.Lib.trace("Enable right click not supported in this browser."); + ,getUnifom: function() { + this.blurUniform = openfl.gl.GL.getUniformLocation(this.shader,"blur"); } -} -flash.Lib.__fullScreenHeight = function() { - return js.Browser.window.innerHeight; -} -flash.Lib.__fullScreenWidth = function() { - return js.Browser.window.innerWidth; -} -flash.Lib.__getHeight = function() { - var tgt = flash.Lib.mMe != null?flash.Lib.mMe.__scr:js.Browser.document.getElementById("haxe:openfl"); - return tgt != null && tgt.clientHeight > 0?tgt.clientHeight:500; -} -flash.Lib.__getStage = function() { - if(flash.Lib.mStage == null) { - var width = flash.Lib.__getWidth(); - var height = flash.Lib.__getHeight(); - flash.Lib.mStage = new flash.display.Stage(width,height); + ,getFragment: function() { + return com.engine.render.filter.Filter.blurYFilter; } - return flash.Lib.mStage; -} -flash.Lib.__getWidth = function() { - var tgt = flash.Lib.mMe != null?flash.Lib.mMe.__scr:js.Browser.document.getElementById("haxe:openfl"); - return tgt != null && tgt.clientWidth > 0?tgt.clientWidth:500; -} -flash.Lib.__isOnStage = function(surface) { - var p = surface; - while(p != null && p != flash.Lib.mMe.__scr) p = p.parentNode; - return p == flash.Lib.mMe.__scr; -} -flash.Lib.__parseColor = function(str,cb) { - var re = new EReg("rgb\\(([0-9]*), ?([0-9]*), ?([0-9]*)\\)",""); - var hex = new EReg("#([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])",""); - if(re.match(str)) { - var col = 0; - var _g = 1; - while(_g < 4) { - var pos = _g++; - var v = Std.parseInt(re.matched(pos)); - col = cb(col,pos - 1,v); - } - return col; - } else if(hex.match(str)) { - var col = 0; - var _g = 1; - while(_g < 4) { - var pos = _g++; - var v = "0x" + hex.matched(pos) & 255; - v = cb(col,pos - 1,v); - } - return col; - } else throw "Cannot parse color '" + str + "'."; -} -flash.Lib.__removeSurface = function(surface) { - if(flash.Lib.mMe.__scr != null) { - var anim = surface.getAttribute("data-openfl-anim"); - if(anim != null) { - var style = js.Browser.document.getElementById(anim); - if(style != null) flash.Lib.mMe.__scr.removeChild(style); - } - if(surface.parentNode != null) surface.parentNode.removeChild(surface); + ,__class__: com.engine.render.filter.BlurYFilter +}); +com.engine.render.filter.ColorMatrixFilter = function(width,height) { + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.ColorMatrixFilter"] = com.engine.render.filter.ColorMatrixFilter; +com.engine.render.filter.ColorMatrixFilter.__name__ = ["com","engine","render","filter","ColorMatrixFilter"]; +com.engine.render.filter.ColorMatrixFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.ColorMatrixFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setMatrix2D: function(mat) { } - return surface; -} -flash.Lib.__setSurfaceBorder = function(surface,color,size) { - surface.style.setProperty("border-color","#" + StringTools.hex(color),""); - surface.style.setProperty("border-style","solid",""); - surface.style.setProperty("border-width",size + "px",""); - surface.style.setProperty("border-collapse","collapse",""); -} -flash.Lib.__setSurfaceClipping = function(surface,rect) { -} -flash.Lib.__setSurfaceFont = function(surface,font,bold,size,color,align,lineHeight) { - surface.style.setProperty("font-family",font,""); - surface.style.setProperty("font-weight",Std.string(bold),""); - surface.style.setProperty("color","#" + StringTools.hex(color),""); - surface.style.setProperty("font-size",size + "px",""); - surface.style.setProperty("text-align",align,""); - surface.style.setProperty("line-height",lineHeight + "px",""); -} -flash.Lib.__setSurfaceOpacity = function(surface,alpha) { - surface.style.setProperty("opacity",Std.string(alpha),""); -} -flash.Lib.__setSurfacePadding = function(surface,padding,margin,display) { - surface.style.setProperty("padding",padding + "px",""); - surface.style.setProperty("margin",margin + "px",""); - surface.style.setProperty("top",padding + 2 + "px",""); - surface.style.setProperty("right",padding + 1 + "px",""); - surface.style.setProperty("left",padding + 1 + "px",""); - surface.style.setProperty("bottom",padding + 1 + "px",""); - surface.style.setProperty("display",display?"inline":"block",""); -} -flash.Lib.__setSurfaceTransform = function(surface,matrix) { - if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1 && surface.getAttribute("data-openfl-anim") == null) { - surface.style.left = matrix.tx + "px"; - surface.style.top = matrix.ty + "px"; - surface.style.setProperty("transform","",""); - surface.style.setProperty("-moz-transform","",""); - surface.style.setProperty("-webkit-transform","",""); - surface.style.setProperty("-o-transform","",""); - surface.style.setProperty("-ms-transform","",""); - } else { - surface.style.left = "0px"; - surface.style.top = "0px"; - surface.style.setProperty("transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); - surface.style.setProperty("-moz-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + "px, " + matrix.ty + "px)",""); - if(!flash.Lib.mForce2DTransform) surface.style.setProperty("-webkit-transform","matrix3d(" + matrix.a + ", " + matrix.b + ", " + "0, 0, " + matrix.c + ", " + matrix.d + ", " + "0, 0, 0, 0, 1, 0, " + matrix.tx + ", " + matrix.ty + ", " + "0, 1" + ")",""); else surface.style.setProperty("-webkit-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); - surface.style.setProperty("-o-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); - surface.style.setProperty("-ms-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); + ,setTransformation: function(x,y,rotation,Scale) { + this.matrix.identity(); + this.matrix.appendTranslation(x,y,0); + this.matrix.appendRotation(rotation,new flash.geom.Vector3D(0,0,1),null); + this.matrix.append(new flash.geom.Matrix3D([Scale,0.0,0.0,0.0,0.0,Scale,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,1.0])); } -} -flash.Lib.__setSurfaceZIndexAfter = function(surface1,surface2) { - if(surface1 != null && surface2 != null) { - if(surface1.parentNode != surface2.parentNode && surface2.parentNode != null) surface2.parentNode.appendChild(surface1); - if(surface2.parentNode != null) { - var nextSibling = surface2.nextSibling; - if(surface1.previousSibling != surface2) { - var swap = flash.Lib.__removeSurface(surface1); - if(nextSibling == null) surface2.parentNode.appendChild(swap); else surface2.parentNode.insertBefore(swap,nextSibling); - } - } + ,setUnifom: function() { + openfl.gl.GL.uniformMatrix3D(this.matrixUniform,false,this.matrix); } -} -flash.Lib.__swapSurface = function(surface1,surface2) { - var parent1 = surface1.parentNode; - var parent2 = surface2.parentNode; - if(parent1 != null && parent2 != null) { - if(parent1 == parent2) { - var next1 = surface1.nextSibling; - var next2 = surface2.nextSibling; - if(next1 == surface2) parent1.insertBefore(surface2,surface1); else if(next2 == surface1) parent1.insertBefore(surface1,surface2); else { - parent1.replaceChild(surface2,surface1); - if(next2 != null) parent1.insertBefore(surface1,next2); else parent1.appendChild(surface1); - } - } else { - var next2 = surface2.nextSibling; - parent1.replaceChild(surface2,surface1); - if(next2 != null) parent2.insertBefore(surface1,next2); else parent2.appendChild(surface1); - } + ,getUnifom: function() { + this.matrix = new flash.geom.Matrix3D([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]); + this.matrixUniform = openfl.gl.GL.getUniformLocation(this.shader,"matrix"); } -} -flash.Lib.__setContentEditable = function(surface,contentEditable) { - if(contentEditable == null) contentEditable = true; - surface.setAttribute("contentEditable",contentEditable?"true":"false"); -} -flash.Lib.__setCursor = function(type) { - if(flash.Lib.mMe != null) flash.Lib.mMe.__scr.style.cursor = (function($this) { - var $r; - switch( (type)[1] ) { - case 0: - $r = "pointer"; - break; - case 1: - $r = "text"; - break; - default: - $r = "default"; - } - return $r; - }(this)); -} -flash.Lib.__setImageSmoothing = function(context,enabled) { - var _g = 0, _g1 = ["imageSmoothingEnabled","mozImageSmoothingEnabled","webkitImageSmoothingEnabled"]; - while(_g < _g1.length) { - var variant = _g1[_g]; - ++_g; - context[variant] = enabled; + ,getFragment: function() { + return com.engine.render.filter.Filter.colormatrixFilter; } -} -flash.Lib.__setSurfaceAlign = function(surface,align) { - surface.style.setProperty("text-align",align,""); -} -flash.Lib.__setSurfaceId = function(surface,name) { - var regex = new EReg("[^a-zA-Z0-9\\-]","g"); - surface.id = regex.replace(name,"_"); -} -flash.Lib.__setSurfaceRotation = function(surface,rotate) { - surface.style.setProperty("transform","rotate(" + rotate + "deg)",""); - surface.style.setProperty("-moz-transform","rotate(" + rotate + "deg)",""); - surface.style.setProperty("-webkit-transform","rotate(" + rotate + "deg)",""); - surface.style.setProperty("-o-transform","rotate(" + rotate + "deg)",""); - surface.style.setProperty("-ms-transform","rotate(" + rotate + "deg)",""); -} -flash.Lib.__setSurfaceScale = function(surface,scale) { - surface.style.setProperty("transform","scale(" + scale + ")",""); - surface.style.setProperty("-moz-transform","scale(" + scale + ")",""); - surface.style.setProperty("-webkit-transform","scale(" + scale + ")",""); - surface.style.setProperty("-o-transform","scale(" + scale + ")",""); - surface.style.setProperty("-ms-transform","scale(" + scale + ")",""); -} -flash.Lib.__setSurfaceSpritesheetAnimation = function(surface,spec,fps) { - if(spec.length == 0) return surface; - var div = js.Browser.document.createElement("div"); - div.style.backgroundImage = "url(" + surface.toDataURL("image/png") + ")"; - div.id = surface.id; - var keyframeTpl = new haxe.Template("background-position: ::left::px ::top::px; width: ::width::px; height: ::height::px; "); - var templateFunc = function(frame) { - return { left : -frame.x, top : -frame.y, width : frame.width, height : frame.height}; - }; - flash.Lib.__createSurfaceAnimationCSS(div,spec,keyframeTpl,templateFunc,fps,true,true); - if(flash.Lib.__isOnStage(surface)) { - flash.Lib.__appendSurface(div); - flash.Lib.__copyStyle(surface,div); - flash.Lib.__swapSurface(surface,div); - flash.Lib.__removeSurface(surface); - } else flash.Lib.__copyStyle(surface,div); - return div; -} -flash.Lib.__setSurfaceVisible = function(surface,visible) { - if(visible) surface.style.setProperty("display","block",""); else surface.style.setProperty("display","none",""); -} -flash.Lib.__setTextDimensions = function(surface,width,height,align) { - surface.style.setProperty("width",width + "px",""); - surface.style.setProperty("height",height + "px",""); - surface.style.setProperty("overflow","hidden",""); - surface.style.setProperty("text-align",align,""); -} -flash.Lib.__surfaceHitTest = function(surface,x,y) { - var _g1 = 0, _g = surface.childNodes.length; - while(_g1 < _g) { - var i = _g1++; - var node = surface.childNodes[i]; - if(x >= node.offsetLeft && x <= node.offsetLeft + node.offsetWidth && y >= node.offsetTop && y <= node.offsetTop + node.offsetHeight) return true; + ,__class__: com.engine.render.filter.ColorMatrixFilter +}); +com.engine.render.filter.ColorStepFilter = function(width,height) { + this.step = 5; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.ColorStepFilter"] = com.engine.render.filter.ColorStepFilter; +com.engine.render.filter.ColorStepFilter.__name__ = ["com","engine","render","filter","ColorStepFilter"]; +com.engine.render.filter.ColorStepFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.ColorStepFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setStep: function(f) { + this.step = f; } - return false; -} -flash.Lib.get_current = function() { - if(flash.Lib.mMainClassRoot == null) { - flash.Lib.mMainClassRoot = new flash.display.MovieClip(); - flash.Lib.mCurrent = flash.Lib.mMainClassRoot; - flash.Lib.__getStage().addChild(flash.Lib.mCurrent); + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.stepUniform,this.step); } - return flash.Lib.mMainClassRoot; -} -flash.Lib.prototype = { - __class__: flash.Lib -} -flash._Lib = {} -flash._Lib.CursorType = $hxClasses["flash._Lib.CursorType"] = { __ename__ : true, __constructs__ : ["Pointer","Text","Default"] } -flash._Lib.CursorType.Pointer = ["Pointer",0]; -flash._Lib.CursorType.Pointer.toString = $estr; -flash._Lib.CursorType.Pointer.__enum__ = flash._Lib.CursorType; -flash._Lib.CursorType.Text = ["Text",1]; -flash._Lib.CursorType.Text.toString = $estr; -flash._Lib.CursorType.Text.__enum__ = flash._Lib.CursorType; -flash._Lib.CursorType.Default = ["Default",2]; -flash._Lib.CursorType.Default.toString = $estr; -flash._Lib.CursorType.Default.__enum__ = flash._Lib.CursorType; -flash._Vector = {} -flash._Vector.Vector_Impl_ = function() { } -$hxClasses["flash._Vector.Vector_Impl_"] = flash._Vector.Vector_Impl_; -flash._Vector.Vector_Impl_.__name__ = ["flash","_Vector","Vector_Impl_"]; -flash._Vector.Vector_Impl_.__properties__ = {set_fixed:"set_fixed",get_fixed:"get_fixed",set_length:"set_length",get_length:"get_length"} -flash._Vector.Vector_Impl_._new = function(length,fixed) { - return new Array(); -} -flash._Vector.Vector_Impl_.concat = function(this1,a) { - return this1.concat(a); -} -flash._Vector.Vector_Impl_.copy = function(this1) { - return this1.slice(); -} -flash._Vector.Vector_Impl_.iterator = function(this1) { - return HxOverrides.iter(this1); -} -flash._Vector.Vector_Impl_.join = function(this1,sep) { - return this1.join(sep); -} -flash._Vector.Vector_Impl_.pop = function(this1) { - return this1.pop(); -} -flash._Vector.Vector_Impl_.push = function(this1,x) { - return this1.push(x); -} -flash._Vector.Vector_Impl_.reverse = function(this1) { - this1.reverse(); -} -flash._Vector.Vector_Impl_.shift = function(this1) { - return this1.shift(); -} -flash._Vector.Vector_Impl_.unshift = function(this1,x) { - this1.unshift(x); -} -flash._Vector.Vector_Impl_.slice = function(this1,pos,end) { - return this1.slice(pos,end); -} -flash._Vector.Vector_Impl_.sort = function(this1,f) { - this1.sort(f); -} -flash._Vector.Vector_Impl_.splice = function(this1,pos,len) { - return this1.splice(pos,len); -} -flash._Vector.Vector_Impl_.toString = function(this1) { - return this1.toString(); -} -flash._Vector.Vector_Impl_.indexOf = function(this1,x,from) { - if(from == null) from = 0; - var _g1 = from, _g = this1.length; - while(_g1 < _g) { - var i = _g1++; - if(this1[i] == x) return i; + ,getUnifom: function() { + this.stepUniform = openfl.gl.GL.getUniformLocation(this.shader,"step"); } - return -1; -} -flash._Vector.Vector_Impl_.lastIndexOf = function(this1,x,from) { - if(from == null) from = 0; - var i = this1.length - 1; - while(i >= from) { - if(this1[i] == x) return i; - i--; + ,getFragment: function() { + return com.engine.render.filter.Filter.colorStepFilter; } - return -1; -} -flash._Vector.Vector_Impl_.ofArray = function(a) { - return flash._Vector.Vector_Impl_.concat(flash._Vector.Vector_Impl_._new(),a); -} -flash._Vector.Vector_Impl_.convert = function(v) { - return v; -} -flash._Vector.Vector_Impl_.fromArray = function(a) { - return a; -} -flash._Vector.Vector_Impl_.toArray = function(this1) { - return this1; -} -flash._Vector.Vector_Impl_.get_length = function(this1) { - return this1.length; -} -flash._Vector.Vector_Impl_.set_length = function(this1,value) { - if(value < this1.length) this1 = this1.slice(0,value); - while(value > this1.length) this1.push(null); - return value; -} -flash._Vector.Vector_Impl_.get_fixed = function(this1) { - return false; -} -flash._Vector.Vector_Impl_.set_fixed = function(this1,value) { - return value; -} -flash.accessibility = {} -flash.accessibility.AccessibilityProperties = function() { - this.description = ""; - this.forceSimple = false; - this.name = ""; - this.noAutoLabeling = false; - this.shortcut = ""; - this.silent = false; + ,__class__: com.engine.render.filter.ColorStepFilter +}); +com.engine.render.filter.CrossHatchFilter = function(width,height) { + this.blur = 0.001953125; + com.engine.render.filter.RenderFilter.call(this,width,height); }; -$hxClasses["flash.accessibility.AccessibilityProperties"] = flash.accessibility.AccessibilityProperties; -flash.accessibility.AccessibilityProperties.__name__ = ["flash","accessibility","AccessibilityProperties"]; -flash.accessibility.AccessibilityProperties.prototype = { - __class__: flash.accessibility.AccessibilityProperties -} -flash.display.Bitmap = function(inBitmapData,inPixelSnapping,inSmoothing) { - if(inSmoothing == null) inSmoothing = false; - flash.display.DisplayObject.call(this); - this.pixelSnapping = inPixelSnapping; - this.smoothing = inSmoothing; - if(inBitmapData != null) { - this.set_bitmapData(inBitmapData); - if(this.bitmapData.__referenceCount == 1) this.__graphics = new flash.display.Graphics(this.bitmapData.___textureBuffer); +$hxClasses["com.engine.render.filter.CrossHatchFilter"] = com.engine.render.filter.CrossHatchFilter; +com.engine.render.filter.CrossHatchFilter.__name__ = ["com","engine","render","filter","CrossHatchFilter"]; +com.engine.render.filter.CrossHatchFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.CrossHatchFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setBlur: function(v) { + this.blur = v; + console.log(this.blur); } - if(this.pixelSnapping == null) this.pixelSnapping = flash.display.PixelSnapping.AUTO; - if(this.__graphics == null) this.__graphics = new flash.display.Graphics(); - if(this.bitmapData != null) this.__render(); + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.blurUniform,this.blur); + } + ,getUnifom: function() { + this.blurUniform = openfl.gl.GL.getUniformLocation(this.shader,"blur"); + } + ,getFragment: function() { + return com.engine.render.filter.Filter.croshatchFilter; + } + ,__class__: com.engine.render.filter.CrossHatchFilter +}); +com.engine.render.filter.DotScreenFilter = function(width,height) { + this.angle = 5; + this.scale = 1; + com.engine.render.filter.RenderFilter.call(this,width,height); }; -$hxClasses["flash.display.Bitmap"] = flash.display.Bitmap; -flash.display.Bitmap.__name__ = ["flash","display","Bitmap"]; -flash.display.Bitmap.__super__ = flash.display.DisplayObject; -flash.display.Bitmap.prototype = $extend(flash.display.DisplayObject.prototype,{ - set_bitmapData: function(inBitmapData) { - if(inBitmapData != this.bitmapData) { - if(this.bitmapData != null) { - this.bitmapData.__referenceCount--; - if(this.__graphics.__surface == this.bitmapData.___textureBuffer) flash.Lib.__setSurfaceOpacity(this.bitmapData.___textureBuffer,0); - } - if(inBitmapData != null) inBitmapData.__referenceCount++; - } - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - this.bitmapData = inBitmapData; - return inBitmapData; +$hxClasses["com.engine.render.filter.DotScreenFilter"] = com.engine.render.filter.DotScreenFilter; +com.engine.render.filter.DotScreenFilter.__name__ = ["com","engine","render","filter","DotScreenFilter"]; +com.engine.render.filter.DotScreenFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.DotScreenFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setAngle: function(v) { + this.angle = v; } - ,__render: function(inMask,clipRect) { - if(!this.__combinedVisible) return; - if(this.bitmapData == null) return; - if((this.___renderFlags & 4) != 0 || (this.___renderFlags & 8) != 0) this.__validateMatrix(); - if(this.bitmapData.___textureBuffer != this.__graphics.__surface) { - var imageDataLease = this.bitmapData.__lease; - if(imageDataLease != null && (this.__currentLease == null || imageDataLease.seed != this.__currentLease.seed || imageDataLease.time != this.__currentLease.time)) { - var srcCanvas = this.bitmapData.___textureBuffer; - this.__graphics.__surface.width = srcCanvas.width; - this.__graphics.__surface.height = srcCanvas.height; - this.__graphics.clear(); - flash.Lib.__drawToSurface(srcCanvas,this.__graphics.__surface); - this.__currentLease = imageDataLease.clone(); - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - this.__applyFilters(this.__graphics.__surface); - this.___renderFlags |= 32; - } - } - if(inMask != null) { - this.__applyFilters(this.__graphics.__surface); - var m = this.getBitmapSurfaceTransform(this.__graphics); - flash.Lib.__drawToSurface(this.__graphics.__surface,inMask,m,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha,clipRect,this.smoothing); - } else { - if((this.___renderFlags & 32) != 0) { - var m = this.getBitmapSurfaceTransform(this.__graphics); - flash.Lib.__setSurfaceTransform(this.__graphics.__surface,m); - this.___renderFlags &= -33; - } - if(!this.__init) { - flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,0); - this.__init = true; - } else flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha); - } + ,setScale: function(v) { + this.scale = v; } - ,__getObjectUnderPoint: function(point) { - if(!this.get_visible()) return null; else if(this.bitmapData != null) { - var local = this.globalToLocal(point); - if(local.x < 0 || local.y < 0 || local.x > this.get_width() / this.get_scaleX() || local.y > this.get_height() / this.get_scaleY()) return null; else return this; - } else return flash.display.DisplayObject.prototype.__getObjectUnderPoint.call(this,point); + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.scaleUniform,this.scale); + openfl.gl.GL.uniform1f(this.angleUniform,this.angle); } - ,__getGraphics: function() { - return this.__graphics; + ,getUnifom: function() { + this.angleUniform = openfl.gl.GL.getUniformLocation(this.shader,"angle"); + this.scaleUniform = openfl.gl.GL.getUniformLocation(this.shader,"scale"); } - ,validateBounds: function() { - if(this.get__boundsInvalid()) { - flash.display.DisplayObject.prototype.validateBounds.call(this); - if(this.bitmapData != null) { - var r = new flash.geom.Rectangle(0,0,this.bitmapData.get_width(),this.bitmapData.get_height()); - if(r.width != 0 || r.height != 0) { - if(this.__boundsRect.width == 0 && this.__boundsRect.height == 0) this.__boundsRect = r.clone(); else this.__boundsRect.extendBounds(r); - } - } - if(this.scale9Grid != null) { - this.__boundsRect.width *= this.__scaleX; - this.__boundsRect.height *= this.__scaleY; - this.__width = this.__boundsRect.width; - this.__height = this.__boundsRect.height; - } else { - this.__width = this.__boundsRect.width * this.__scaleX; - this.__height = this.__boundsRect.height * this.__scaleY; - } - } + ,getFragment: function() { + return com.engine.render.filter.Filter.dotscreenFilter; } - ,toString: function() { - return "[Bitmap name=" + this.name + " id=" + this.___id + "]"; + ,__class__: com.engine.render.filter.DotScreenFilter +}); +com.engine.render.filter.Filter = function() { } +$hxClasses["com.engine.render.filter.Filter"] = com.engine.render.filter.Filter; +com.engine.render.filter.Filter.__name__ = ["com","engine","render","filter","Filter"]; +com.engine.render.filter.GrayFilter = function(width,height) { + this.gray = 1; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.GrayFilter"] = com.engine.render.filter.GrayFilter; +com.engine.render.filter.GrayFilter.__name__ = ["com","engine","render","filter","GrayFilter"]; +com.engine.render.filter.GrayFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.GrayFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setGray: function(f) { + this.gray = f; } - ,getBitmapSurfaceTransform: function(gfx) { - var extent = gfx.__extentWithFilters; - var fm = this.transform.__getFullMatrix(null); - fm.__translateTransformed(extent.get_topLeft()); - return fm; + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.grayUniform,this.gray); } - ,__class__: flash.display.Bitmap - ,__properties__: $extend(flash.display.DisplayObject.prototype.__properties__,{set_bitmapData:"set_bitmapData"}) + ,getUnifom: function() { + this.grayUniform = openfl.gl.GL.getUniformLocation(this.shader,"gray"); + } + ,getFragment: function() { + return com.engine.render.filter.Filter.grayFilter; + } + ,__class__: com.engine.render.filter.GrayFilter }); -flash.display.BitmapData = function(width,height,transparent,inFillColor) { - if(inFillColor == null) inFillColor = -1; - if(transparent == null) transparent = true; - this.__locked = false; - this.__referenceCount = 0; - this.__leaseNum = 0; - this.__lease = new flash.display.ImageDataLease(); - this.__lease.set(this.__leaseNum++,new Date().getTime()); - this.___textureBuffer = js.Browser.document.createElement("canvas"); - this.___textureBuffer.width = width; - this.___textureBuffer.height = height; - this.___id = flash.utils.Uuid.uuid(); - flash.Lib.__setSurfaceId(this.___textureBuffer,this.___id); - this.__transparent = transparent; - this.rect = new flash.geom.Rectangle(0,0,width,height); - if(this.__transparent) { - this.__transparentFiller = js.Browser.document.createElement("canvas"); - this.__transparentFiller.width = width; - this.__transparentFiller.height = height; - var ctx = this.__transparentFiller.getContext("2d"); - ctx.fillStyle = "rgba(0,0,0,0);"; - ctx.fill(); +com.engine.render.filter.InvertFilter = function(width,height) { + this.invert = 1; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.InvertFilter"] = com.engine.render.filter.InvertFilter; +com.engine.render.filter.InvertFilter.__name__ = ["com","engine","render","filter","InvertFilter"]; +com.engine.render.filter.InvertFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.InvertFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setInvert: function(f) { + this.invert = f; } - if(inFillColor != null && width > 0 && height > 0) { - if(!this.__transparent) inFillColor |= -16777216; - this.__initColor = inFillColor; - this.__fillRect(this.rect,inFillColor); + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.invertUniform,this.invert); + } + ,getUnifom: function() { + this.invertUniform = openfl.gl.GL.getUniformLocation(this.shader,"invert"); + } + ,getFragment: function() { + return com.engine.render.filter.Filter.invertFilter; } + ,__class__: com.engine.render.filter.InvertFilter +}); +com.engine.render.filter.NormalFilter = function(width,height) { + com.engine.render.filter.RenderFilter.call(this,width,height); }; -$hxClasses["flash.display.BitmapData"] = flash.display.BitmapData; -flash.display.BitmapData.__name__ = ["flash","display","BitmapData"]; -flash.display.BitmapData.__interfaces__ = [flash.display.IBitmapDrawable]; -flash.display.BitmapData.getRGBAPixels = function(bitmapData) { - var p = bitmapData.getPixels(new flash.geom.Rectangle(0,0,bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0,bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0)); - var num = (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0) * (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0); - p.position = 0; - var _g = 0; - while(_g < num) { - var i = _g++; - var pos = p.position; - var alpha = p.readByte(); - var red = p.readByte(); - var green = p.readByte(); - var blue = p.readByte(); - p.position = pos; - p.writeByte(red); - p.writeByte(green); - p.writeByte(blue); - p.writeByte(alpha); +$hxClasses["com.engine.render.filter.NormalFilter"] = com.engine.render.filter.NormalFilter; +com.engine.render.filter.NormalFilter.__name__ = ["com","engine","render","filter","NormalFilter"]; +com.engine.render.filter.NormalFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.NormalFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setUnifom: function() { } - return p; -} -flash.display.BitmapData.loadFromBase64 = function(base64,type,onload) { - var bitmapData = new flash.display.BitmapData(0,0); - bitmapData.__loadFromBase64(base64,type,onload); - return bitmapData; -} -flash.display.BitmapData.loadFromBytes = function(bytes,inRawAlpha,onload) { - var bitmapData = new flash.display.BitmapData(0,0); - bitmapData.__loadFromBytes(bytes,inRawAlpha,onload); - return bitmapData; -} -flash.display.BitmapData.__base64Encode = function(bytes) { - var blob = ""; - var codex = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - bytes.position = 0; - while(bytes.position < bytes.length) { - var by1 = 0, by2 = 0, by3 = 0; - by1 = bytes.readByte(); - if(bytes.position < bytes.length) by2 = bytes.readByte(); - if(bytes.position < bytes.length) by3 = bytes.readByte(); - var by4 = 0, by5 = 0, by6 = 0, by7 = 0; - by4 = by1 >> 2; - by5 = (by1 & 3) << 4 | by2 >> 4; - by6 = (by2 & 15) << 2 | by3 >> 6; - by7 = by3 & 63; - blob += codex.charAt(by4); - blob += codex.charAt(by5); - if(bytes.position < bytes.length) blob += codex.charAt(by6); else blob += "="; - if(bytes.position < bytes.length) blob += codex.charAt(by7); else blob += "="; + ,getUnifom: function() { } - return blob; -} -flash.display.BitmapData.__createFromHandle = function(inHandle) { - var result = new flash.display.BitmapData(0,0); - result.___textureBuffer = inHandle; - return result; -} -flash.display.BitmapData.__isJPG = function(bytes) { - bytes.position = 0; - return bytes.readByte() == 255 && bytes.readByte() == 216; -} -flash.display.BitmapData.__isPNG = function(bytes) { - bytes.position = 0; - return bytes.readByte() == 137 && bytes.readByte() == 80 && bytes.readByte() == 78 && bytes.readByte() == 71 && bytes.readByte() == 13 && bytes.readByte() == 10 && bytes.readByte() == 26 && bytes.readByte() == 10; -} -flash.display.BitmapData.prototype = { - get_width: function() { - if(this.___textureBuffer != null) return this.___textureBuffer.width; else return 0; + ,getFragment: function() { + return com.engine.render.filter.Filter.normalFilter; } - ,get_transparent: function() { - return this.__transparent; + ,__class__: com.engine.render.filter.NormalFilter +}); +com.engine.render.filter.PixelateFilter = function(width,height) { + this.pixelSizeY = 0.9; + this.pixelSizeX = 0.9; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.PixelateFilter"] = com.engine.render.filter.PixelateFilter; +com.engine.render.filter.PixelateFilter.__name__ = ["com","engine","render","filter","PixelateFilter"]; +com.engine.render.filter.PixelateFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.PixelateFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setPixelSize: function(x,y) { + this.pixelSizeX = x; + this.pixelSizeY = y; } - ,get_height: function() { - if(this.___textureBuffer != null) return this.___textureBuffer.height; else return 0; + ,setUnifom: function() { + openfl.gl.GL.uniform2f(this.pixelSizeUniform,this.pixelSizeX,this.pixelSizeY); } - ,__onLoad: function(data,e) { - var canvas = data.texture; - var width = data.image.width; - var height = data.image.height; - canvas.width = width; - canvas.height = height; - var ctx = canvas.getContext("2d"); - ctx.drawImage(data.image,0,0,width,height); - data.bitmapData.width = width; - data.bitmapData.height = height; - data.bitmapData.rect = new flash.geom.Rectangle(0,0,width,height); - data.bitmapData.__buildLease(); - if(data.inLoader != null) { - var e1 = new flash.events.Event(flash.events.Event.COMPLETE); - e1.target = data.inLoader; - data.inLoader.dispatchEvent(e1); - } + ,getUnifom: function() { + this.pixelSizeUniform = openfl.gl.GL.getUniformLocation(this.shader,"pixelSize"); } - ,__loadFromFile: function(inFilename,inLoader) { - var _g = this; - var image = js.Browser.document.createElement("img"); - if(inLoader != null) { - var data = { image : image, texture : this.___textureBuffer, inLoader : inLoader, bitmapData : this}; - image.addEventListener("load",(function(f,a1) { - return function(e) { - return f(a1,e); - }; - })($bind(this,this.__onLoad),data),false); - image.addEventListener("error",function(e) { - if(!image.complete) _g.__onLoad(data,e); - },false); - } - image.src = inFilename; - if(image.complete) { - } + ,getFragment: function() { + return com.engine.render.filter.Filter.pixelateFilter; } - ,__incrNumRefBitmaps: function() { - this.__assignedBitmaps++; + ,__class__: com.engine.render.filter.PixelateFilter +}); +com.engine.render.filter.RGBSplitFilter = function(width,height) { + this.colordistance = 10000; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.RGBSplitFilter"] = com.engine.render.filter.RGBSplitFilter; +com.engine.render.filter.RGBSplitFilter.__name__ = ["com","engine","render","filter","RGBSplitFilter"]; +com.engine.render.filter.RGBSplitFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.RGBSplitFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setUnifom: function() { + openfl.gl.GL.uniform1f(this.subtractUniform,this.colordistance); + openfl.gl.GL.uniform2f(this.redUniform,20,20); + openfl.gl.GL.uniform2f(this.greenUniform,-20,20); + openfl.gl.GL.uniform2f(this.blueUniform,20,-20); + } + ,getUnifom: function() { + this.redUniform = openfl.gl.GL.getUniformLocation(this.shader,"red"); + this.greenUniform = openfl.gl.GL.getUniformLocation(this.shader,"green"); + this.blueUniform = openfl.gl.GL.getUniformLocation(this.shader,"blue"); + this.subtractUniform = openfl.gl.GL.getUniformLocation(this.shader,"distance"); + } + ,getFragment: function() { + return com.engine.render.filter.Filter.rgbsplitFilter; + } + ,__class__: com.engine.render.filter.RGBSplitFilter +}); +com.engine.render.filter.SepiaFilter = function(width,height) { + this.sepia = 1; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.SepiaFilter"] = com.engine.render.filter.SepiaFilter; +com.engine.render.filter.SepiaFilter.__name__ = ["com","engine","render","filter","SepiaFilter"]; +com.engine.render.filter.SepiaFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.SepiaFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setSepia: function(f) { + this.sepia = f; } - ,__getNumRefBitmaps: function() { - return this.__assignedBitmaps; + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.sepiaUniform,this.sepia); } - ,__loadFromBytes: function(bytes,inRawAlpha,onload) { - var _g = this; - var type = ""; - if(flash.display.BitmapData.__isPNG(bytes)) type = "image/png"; else if(flash.display.BitmapData.__isJPG(bytes)) type = "image/jpeg"; else throw new flash.errors.IOError("BitmapData tried to read a PNG/JPG ByteArray, but found an invalid header."); - if(inRawAlpha != null) this.__loadFromBase64(flash.display.BitmapData.__base64Encode(bytes),type,function(_) { - var ctx = _g.___textureBuffer.getContext("2d"); - var pixels = ctx.getImageData(0,0,_g.___textureBuffer.width,_g.___textureBuffer.height); - var _g2 = 0, _g1 = inRawAlpha.length; - while(_g2 < _g1) { - var i = _g2++; - pixels.data[i * 4 + 3] = inRawAlpha.readUnsignedByte(); - } - ctx.putImageData(pixels,0,0); - if(onload != null) onload(_g); - }); else this.__loadFromBase64(flash.display.BitmapData.__base64Encode(bytes),type,onload); + ,getUnifom: function() { + this.sepiaUniform = openfl.gl.GL.getUniformLocation(this.shader,"sepia"); } - ,__loadFromBase64: function(base64,type,onload) { - var _g = this; - var img = js.Browser.document.createElement("img"); - var canvas = this.___textureBuffer; - var drawImage = function(_) { - canvas.width = img.width; - canvas.height = img.height; - var ctx = canvas.getContext("2d"); - ctx.drawImage(img,0,0); - _g.rect = new flash.geom.Rectangle(0,0,canvas.width,canvas.height); - if(onload != null) onload(_g); - }; - img.addEventListener("load",drawImage,false); - img.src = "data:" + type + ";base64," + base64; + ,getFragment: function() { + return com.engine.render.filter.Filter.sepiaFilter; } - ,__getLease: function() { - return this.__lease; + ,__class__: com.engine.render.filter.SepiaFilter +}); +com.engine.render.filter.TwistFilter = function(width,height) { + this.offsety = 0.5; + this.offsetx = 0.5; + this.angle = 5; + this.radius = 0.5; + com.engine.render.filter.RenderFilter.call(this,width,height); +}; +$hxClasses["com.engine.render.filter.TwistFilter"] = com.engine.render.filter.TwistFilter; +com.engine.render.filter.TwistFilter.__name__ = ["com","engine","render","filter","TwistFilter"]; +com.engine.render.filter.TwistFilter.__super__ = com.engine.render.filter.RenderFilter; +com.engine.render.filter.TwistFilter.prototype = $extend(com.engine.render.filter.RenderFilter.prototype,{ + setOffset: function(x,y) { + this.offsetx = x; + this.offsety = y; + } + ,setAngle: function(v) { + this.angle = v; + } + ,setRadius: function(v) { + this.radius = v; + } + ,setUnifom: function() { + openfl.gl.GL.uniform1f(this.radiusUniform,this.radius); + openfl.gl.GL.uniform1f(this.angleUniform,this.angle); + openfl.gl.GL.uniform2f(this.offsetUniform,this.offsetx,this.offsety); + } + ,getUnifom: function() { + this.radiusUniform = openfl.gl.GL.getUniformLocation(this.shader,"radius"); + this.angleUniform = openfl.gl.GL.getUniformLocation(this.shader,"angle"); + this.offsetUniform = openfl.gl.GL.getUniformLocation(this.shader,"offset"); + } + ,getFragment: function() { + return com.engine.render.filter.Filter.twistFilter; + } + ,__class__: com.engine.render.filter.TwistFilter +}); +flash.text = {} +flash.text.TextField = function() { + flash.display.InteractiveObject.call(this); + this.mWidth = 100; + this.mHeight = 20; + this.mHTMLMode = false; + this.multiline = false; + this.__graphics = new flash.display.Graphics(); + this.mFace = flash.text.TextField.mDefaultFont; + this.mAlign = flash.text.TextFormatAlign.LEFT; + this.mParagraphs = new Array(); + this.mSelStart = -1; + this.mSelEnd = -1; + this.scrollH = 0; + this.scrollV = 1; + this.mType = flash.text.TextFieldType.DYNAMIC; + this.set_autoSize("NONE"); + this.mTextHeight = 12; + this.mMaxHeight = this.mTextHeight; + this.mHTMLText = " "; + this.mText = " "; + this.mTextColour = 0; + this.tabEnabled = false; + this.mTryFreeType = true; + this.selectable = true; + this.mInsertPos = 0; + this.__inputEnabled = false; + this.mDownChar = 0; + this.mSelectDrag = -1; + this.mLineInfo = []; + this.set_defaultTextFormat(new flash.text.TextFormat()); + this.set_borderColor(0); + this.set_border(false); + this.set_backgroundColor(16777215); + this.set_background(false); + this.gridFitType = flash.text.GridFitType.PIXEL; + this.sharpness = 0; +}; +$hxClasses["flash.text.TextField"] = flash.text.TextField; +flash.text.TextField.__name__ = ["flash","text","TextField"]; +flash.text.TextField.__super__ = flash.display.InteractiveObject; +flash.text.TextField.prototype = $extend(flash.display.InteractiveObject.prototype,{ + set_wordWrap: function(inWordWrap) { + this.wordWrap = inWordWrap; + this.Rebuild(); + return this.get_wordWrap(); } - ,__fillRect: function(rect,color) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var r = (color & 16711680) >>> 16; - var g = (color & 65280) >>> 8; - var b = color & 255; - var a = this.__transparent?color >>> 24:255; - if(!this.__locked) { - var style = "rgba(" + r + ", " + g + ", " + b + ", " + a / 255 + ")"; - ctx.fillStyle = style; - ctx.fillRect(rect.x,rect.y,rect.width,rect.height); - } else { - var s = 4 * (Math.round(rect.x) + Math.round(rect.y) * this.__imageData.width); - var offsetY; - var offsetX; - var _g1 = 0, _g = Math.round(rect.height); - while(_g1 < _g) { - var i = _g1++; - offsetY = i * this.__imageData.width; - var _g3 = 0, _g2 = Math.round(rect.width); - while(_g3 < _g2) { - var j = _g3++; - offsetX = 4 * (j + offsetY); - this.__imageData.data[s + offsetX] = r; - this.__imageData.data[s + offsetX + 1] = g; - this.__imageData.data[s + offsetX + 2] = b; - this.__imageData.data[s + offsetX + 3] = a; - } - } - this.__imageDataChanged = true; + ,get_wordWrap: function() { + return this.wordWrap; + } + ,set_width: function(inValue) { + if(this.parent != null) this.parent.__invalidateBounds(); + if(this.get__boundsInvalid()) this.validateBounds(); + if(inValue != this.mWidth) { + this.mWidth = inValue; + this.Rebuild(); } + return this.mWidth; } - ,__decrNumRefBitmaps: function() { - this.__assignedBitmaps--; + ,get_width: function() { + return Math.max(this.mWidth,this.getBounds(this.get_stage()).width); } - ,__clearCanvas: function() { - var ctx = this.___textureBuffer.getContext("2d"); - ctx.clearRect(0,0,this.___textureBuffer.width,this.___textureBuffer.height); + ,set_type: function(inType) { + this.mType = inType; + this.__inputEnabled = this.mType == flash.text.TextFieldType.INPUT; + if(this.mHTMLMode) { + if(this.__inputEnabled) flash.Lib.__setContentEditable(this.__graphics.__surface,true); else flash.Lib.__setContentEditable(this.__graphics.__surface,false); + } else if(this.__inputEnabled) { + this.set_htmlText(StringTools.replace(this.mText,"\n","
")); + flash.Lib.__setContentEditable(this.__graphics.__surface,true); + } + this.tabEnabled = this.get_type() == flash.text.TextFieldType.INPUT; + this.Rebuild(); + return inType; } - ,__buildLease: function() { - this.__lease.set(this.__leaseNum++,new Date().getTime()); + ,get_type: function() { + return this.mType; } - ,unlock: function(changeRect) { - this.__locked = false; - var ctx = this.___textureBuffer.getContext("2d"); - if(this.__imageDataChanged) { - if(changeRect != null) ctx.putImageData(this.__imageData,0,0,changeRect.x,changeRect.y,changeRect.width,changeRect.height); else ctx.putImageData(this.__imageData,0,0); - } - var _g = 0, _g1 = this.__copyPixelList; - while(_g < _g1.length) { - var copyCache = _g1[_g]; - ++_g; - if(this.__transparent && copyCache.transparentFiller != null) { - var trpCtx = copyCache.transparentFiller.getContext("2d"); - var trpData = trpCtx.getImageData(copyCache.sourceX,copyCache.sourceY,copyCache.sourceWidth,copyCache.sourceHeight); - ctx.putImageData(trpData,copyCache.destX,copyCache.destY); - } - ctx.drawImage(copyCache.handle,copyCache.sourceX,copyCache.sourceY,copyCache.sourceWidth,copyCache.sourceHeight,copyCache.destX,copyCache.destY,copyCache.sourceWidth,copyCache.sourceHeight); - } - this.__lease.set(this.__leaseNum++,new Date().getTime()); + ,get_textHeight: function() { + return this.mMaxHeight; } - ,threshold: function(sourceBitmapData,sourceRect,destPoint,operation,threshold,color,mask,copySource) { - if(copySource == null) copySource = false; - if(mask == null) mask = -1; - if(color == null) color = 0; - console.log("BitmapData.threshold not implemented"); - return 0; + ,get_textWidth: function() { + return this.mMaxWidth; } - ,setPixels: function(rect,byteArray) { - rect = this.clipRect(rect); - if(rect == null) return; - var len = Math.round(4 * rect.width * rect.height); - if(!this.__locked) { - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.createImageData(rect.width,rect.height); - var _g = 0; - while(_g < len) { - var i = _g++; - imageData.data[i] = byteArray.readByte(); - } - ctx.putImageData(imageData,rect.x,rect.y); - } else { - var offset = Math.round(4 * this.__imageData.width * rect.y + rect.x * 4); - var pos = offset; - var boundR = Math.round(4 * (rect.x + rect.width)); - var _g = 0; - while(_g < len) { - var i = _g++; - if(pos % (this.__imageData.width * 4) > boundR - 1) pos += this.__imageData.width * 4 - boundR; - this.__imageData.data[pos] = byteArray.readByte(); - pos++; - } - this.__imageDataChanged = true; - } + ,set_textColor: function(inCol) { + this.mTextColour = inCol; + this.RebuildText(); + return inCol; } - ,setPixel32: function(x,y,color) { - if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return; - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.createImageData(1,1); - imageData.data[0] = (color & 16711680) >>> 16; - imageData.data[1] = (color & 65280) >>> 8; - imageData.data[2] = color & 255; - if(this.__transparent) imageData.data[3] = (color & -16777216) >>> 24; else imageData.data[3] = 255; - ctx.putImageData(imageData,x,y); - } else { - var offset = 4 * y * this.__imageData.width + x * 4; - this.__imageData.data[offset] = (color & 16711680) >>> 16; - this.__imageData.data[offset + 1] = (color & 65280) >>> 8; - this.__imageData.data[offset + 2] = color & 255; - if(this.__transparent) this.__imageData.data[offset + 3] = (color & -16777216) >>> 24; else this.__imageData.data[offset + 3] = 255; - this.__imageDataChanged = true; - } + ,get_textColor: function() { + return this.mTextColour; } - ,setPixel: function(x,y,color) { - if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return; - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.createImageData(1,1); - imageData.data[0] = (color & 16711680) >>> 16; - imageData.data[1] = (color & 65280) >>> 8; - imageData.data[2] = color & 255; - if(this.__transparent) imageData.data[3] = 255; - ctx.putImageData(imageData,x,y); - } else { - var offset = 4 * y * this.__imageData.width + x * 4; - this.__imageData.data[offset] = (color & 16711680) >>> 16; - this.__imageData.data[offset + 1] = (color & 65280) >>> 8; - this.__imageData.data[offset + 2] = color & 255; - if(this.__transparent) this.__imageData.data[offset + 3] = 255; - this.__imageDataChanged = true; - } + ,set_text: function(inText) { + this.mText = Std.string(inText); + this.mHTMLMode = false; + this.RebuildText(); + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + return this.mText; } - ,scroll: function(x,y) { - throw "bitmapData.scroll is currently not supported for HTML5"; + ,get_text: function() { + if(this.mHTMLMode) this.ConvertHTMLToText(false); + return this.mText; } - ,noise: function(randomSeed,low,high,channelOptions,grayScale) { - if(grayScale == null) grayScale = false; - if(channelOptions == null) channelOptions = 7; - if(high == null) high = 255; - if(low == null) low = 0; - var generator = new flash.display._BitmapData.MinstdGenerator(randomSeed); - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = null; - if(this.__locked) imageData = this.__imageData; else imageData = ctx.createImageData(this.___textureBuffer.width,this.___textureBuffer.height); - var _g1 = 0, _g = this.___textureBuffer.width * this.___textureBuffer.height; - while(_g1 < _g) { - var i = _g1++; - if(grayScale) imageData.data[i * 4] = imageData.data[i * 4 + 1] = imageData.data[i * 4 + 2] = low + generator.nextValue() % (high - low + 1); else { - imageData.data[i * 4] = (channelOptions & 1) == 0?0:low + generator.nextValue() % (high - low + 1); - imageData.data[i * 4 + 1] = (channelOptions & 2) == 0?0:low + generator.nextValue() % (high - low + 1); - imageData.data[i * 4 + 2] = (channelOptions & 4) == 0?0:low + generator.nextValue() % (high - low + 1); - } - imageData.data[i * 4 + 3] = (channelOptions & 8) == 0?255:low + generator.nextValue() % (high - low + 1); - } - if(this.__locked) this.__imageDataChanged = true; else ctx.putImageData(imageData,0,0); + ,set_scrollV: function(value) { + return this.scrollV = value; } - ,lock: function() { - this.__locked = true; - var ctx = this.___textureBuffer.getContext("2d"); - this.__imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); - this.__imageDataChanged = false; - this.__copyPixelList = []; + ,get_scrollV: function() { + return this.scrollV; } - ,hitTest: function(firstPoint,firstAlphaThreshold,secondObject,secondBitmapDataPoint,secondAlphaThreshold) { - if(secondAlphaThreshold == null) secondAlphaThreshold = 1; - var type = Type.getClassName(Type.getClass(secondObject)); - firstAlphaThreshold = firstAlphaThreshold & -1; - var me = this; - var doHitTest = function(imageData) { - if(secondObject.__proto__ == null || secondObject.__proto__.__class__ == null || secondObject.__proto__.__class__.__name__ == null) return false; - var _g = secondObject.__proto__.__class__.__name__[2]; - switch(_g) { - case "Rectangle": - var rect = secondObject; - rect.x -= firstPoint.x; - rect.y -= firstPoint.y; - rect = me.clipRect(me.rect); - if(me.rect == null) return false; - var boundingBox = new flash.geom.Rectangle(0,0,me.___textureBuffer != null?me.___textureBuffer.width:0,me.___textureBuffer != null?me.___textureBuffer.height:0); - if(!rect.intersects(boundingBox)) return false; - var diff = rect.intersection(boundingBox); - var offset = 4 * (Math.round(diff.x) + Math.round(diff.y) * imageData.width) + 3; - var pos = offset; - var boundR = Math.round(4 * (diff.x + diff.width)); - while(pos < offset + Math.round(4 * (diff.width + imageData.width * diff.height))) { - if(pos % (imageData.width * 4) > boundR - 1) pos += imageData.width * 4 - boundR; - if(imageData.data[pos] - firstAlphaThreshold >= 0) return true; - pos += 4; - } - return false; - case "Point": - var point = secondObject; - var x = point.x - firstPoint.x; - var y = point.y - firstPoint.y; - if(x < 0 || y < 0 || x >= (me.___textureBuffer != null?me.___textureBuffer.width:0) || y >= (me.___textureBuffer != null?me.___textureBuffer.height:0)) return false; - if(imageData.data[Math.round(4 * (y * (me.___textureBuffer != null?me.___textureBuffer.width:0) + x)) + 3] - firstAlphaThreshold > 0) return true; - return false; - case "Bitmap": - throw "bitmapData.hitTest with a second object of type Bitmap is currently not supported for HTML5"; - return false; - case "BitmapData": - throw "bitmapData.hitTest with a second object of type BitmapData is currently not supported for HTML5"; - return false; - default: - throw "BitmapData::hitTest secondObject argument must be either a Rectangle, a Point, a Bitmap or a BitmapData object."; - return false; - } - }; - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); - return doHitTest(imageData); - } else return doHitTest(this.__imageData); + ,set_scrollH: function(value) { + return this.scrollH = value; } - ,handle: function() { - return this.___textureBuffer; + ,get_scrollH: function() { + return this.scrollH; } - ,getPixels: function(rect) { - var len = Math.round(4 * rect.width * rect.height); - var byteArray = new flash.utils.ByteArray(); - if(byteArray.allocated < len) byteArray.___resizeBuffer(byteArray.allocated = Math.max(len,byteArray.allocated * 2) | 0); else if(byteArray.allocated > len) byteArray.___resizeBuffer(byteArray.allocated = len); - byteArray.length = len; - len; - rect = this.clipRect(rect); - if(rect == null) return byteArray; - if(!this.__locked) { - var ctx = this.___textureBuffer.getContext("2d"); - var imagedata = ctx.getImageData(rect.x,rect.y,rect.width,rect.height); - var _g = 0; - while(_g < len) { - var i = _g++; - byteArray.writeByte(imagedata.data[i]); - } - } else { - var offset = Math.round(4 * this.__imageData.width * rect.y + rect.x * 4); - var pos = offset; - var boundR = Math.round(4 * (rect.x + rect.width)); - var _g = 0; - while(_g < len) { - var i = _g++; - if(pos % (this.__imageData.width * 4) > boundR - 1) pos += this.__imageData.width * 4 - boundR; - byteArray.writeByte(this.__imageData.data[pos]); - pos++; - } - } - byteArray.position = 0; - return byteArray; + ,get_numLines: function() { + return 0; } - ,getPixel32: function(x,y) { - if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return 0; - if(!this.__locked) { - var ctx = this.___textureBuffer.getContext("2d"); - return this.getInt32(0,ctx.getImageData(x,y,1,1).data); - } else return this.getInt32(4 * y * this.___textureBuffer.width + x * 4,this.__imageData.data); + ,set_multiline: function(value) { + return this.multiline = value; } - ,getPixel: function(x,y) { - if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return 0; - if(!this.__locked) { - var ctx = this.___textureBuffer.getContext("2d"); - var imagedata = ctx.getImageData(x,y,1,1); - return imagedata.data[0] << 16 | imagedata.data[1] << 8 | imagedata.data[2]; - } else { - var offset = 4 * y * (this.___textureBuffer != null?this.___textureBuffer.width:0) + x * 4; - return this.__imageData.data[offset] << 16 | this.__imageData.data[offset + 1] << 8 | this.__imageData.data[offset + 2]; - } + ,get_multiline: function() { + return this.multiline; } - ,getInt32: function(offset,data) { - return (this.__transparent?data[offset + 3]:255) << 24 | data[offset] << 16 | data[offset + 1] << 8 | data[offset + 2]; + ,get_maxScrollV: function() { + return 0; } - ,getColorBoundsRect: function(mask,color,findColor) { - if(findColor == null) findColor = true; - var me = this; - var doGetColorBoundsRect = function(data) { - var minX = me.___textureBuffer != null?me.___textureBuffer.width:0, maxX = 0, minY = me.___textureBuffer != null?me.___textureBuffer.height:0, maxY = 0, i = 0; - while(i < data.length) { - var value = me.getInt32(i,data); - if(findColor) { - if((value & mask) == color) { - var x = Math.round(i % ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4) / 4); - var y = Math.round(i / ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4)); - if(x < minX) minX = x; - if(x > maxX) maxX = x; - if(y < minY) minY = y; - if(y > maxY) maxY = y; - } - } else if((value & mask) != color) { - var x = Math.round(i % ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4) / 4); - var y = Math.round(i / ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4)); - if(x < minX) minX = x; - if(x > maxX) maxX = x; - if(y < minY) minY = y; - if(y > maxY) maxY = y; - } - i += 4; - } - if(minX < maxX && minY < maxY) return new flash.geom.Rectangle(minX,minY,maxX - minX + 1,maxY - minY); else return new flash.geom.Rectangle(0,0,me.___textureBuffer != null?me.___textureBuffer.width:0,me.___textureBuffer != null?me.___textureBuffer.height:0); - }; - if(!this.__locked) { - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); - return doGetColorBoundsRect(imageData.data); - } else return doGetColorBoundsRect(this.__imageData.data); + ,get_maxScrollH: function() { + return 0; } - ,floodFill: function(x,y,color) { - var wasLocked = this.__locked; - if(!this.__locked) this.lock(); - var queue = new Array(); - queue.push(new flash.geom.Point(x,y)); - var old = this.getPixel32(x,y); - var iterations = 0; - var search = new Array(); - var _g1 = 0, _g = (this.___textureBuffer != null?this.___textureBuffer.width:0) + 1; - while(_g1 < _g) { - var i = _g1++; - var column = new Array(); - var _g3 = 0, _g2 = (this.___textureBuffer != null?this.___textureBuffer.height:0) + 1; - while(_g3 < _g2) { - var i1 = _g3++; - column.push(false); + ,set_htmlText: function(inHTMLText) { + this.mParagraphs = new Array(); + this.mHTMLText = inHTMLText; + if(!this.mHTMLMode) { + var domElement = js.Browser.document.createElement("div"); + if(this.background || this.border) { + domElement.style.width = this.mWidth + "px"; + domElement.style.height = this.mHeight + "px"; } - search.push(column); - } - var currPoint, newPoint; - while(queue.length > 0) { - currPoint = queue.shift(); - ++iterations; - var x1 = currPoint.x | 0; - var y1 = currPoint.y | 0; - if(x1 < 0 || x1 >= (this.___textureBuffer != null?this.___textureBuffer.width:0)) continue; - if(y1 < 0 || y1 >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) continue; - search[x1][y1] = true; - if(this.getPixel32(x1,y1) == old) { - this.setPixel32(x1,y1,color); - if(!search[x1 + 1][y1]) queue.push(new flash.geom.Point(x1 + 1,y1)); - if(!search[x1][y1 + 1]) queue.push(new flash.geom.Point(x1,y1 + 1)); - if(x1 > 0 && !search[x1 - 1][y1]) queue.push(new flash.geom.Point(x1 - 1,y1)); - if(y1 > 0 && !search[x1][y1 - 1]) queue.push(new flash.geom.Point(x1,y1 - 1)); + if(this.background) domElement.style.backgroundColor = "#" + StringTools.hex(this.backgroundColor,6); + if(this.border) domElement.style.border = "1px solid #" + StringTools.hex(this.borderColor,6); + domElement.style.color = "#" + StringTools.hex(this.mTextColour,6); + domElement.style.fontFamily = this.mFace; + domElement.style.fontSize = this.mTextHeight + "px"; + domElement.style.textAlign = Std.string(this.mAlign); + var wrapper = domElement; + wrapper.innerHTML = inHTMLText; + var destination = new flash.display.Graphics(wrapper); + var __surface = this.__graphics.__surface; + if(flash.Lib.__isOnStage(__surface)) { + flash.Lib.__appendSurface(wrapper); + flash.Lib.__copyStyle(__surface,wrapper); + flash.Lib.__swapSurface(__surface,wrapper); + flash.Lib.__removeSurface(__surface); } - } - if(!wasLocked) this.unlock(); - } - ,fillRect: function(rect,color) { - if(rect == null) return; - if(rect.width <= 0 || rect.height <= 0) return; - if(rect.x == 0 && rect.y == 0 && rect.width == this.___textureBuffer.width && rect.height == this.___textureBuffer.height) { - if(this.__transparent) { - if(color >>> 24 == 0 || color == this.__initColor) return this.__clearCanvas(); - } else if((color | -16777216) == (this.__initColor | -16777216)) return this.__clearCanvas(); - } - return this.__fillRect(rect,color); + this.__graphics = destination; + this.__graphics.__extent.width = wrapper.width; + this.__graphics.__extent.height = wrapper.height; + } else this.__graphics.__surface.innerHTML = inHTMLText; + this.mHTMLMode = true; + this.RebuildText(); + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + return this.mHTMLText; } - ,drawToSurface: function(inSurface,matrix,inColorTransform,blendMode,clipRect,smoothing) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = inSurface.getContext("2d"); - if(matrix != null) { - ctx.save(); - if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1) ctx.translate(matrix.tx,matrix.ty); else { - flash.Lib.__setImageSmoothing(ctx,smoothing); - ctx.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.tx,matrix.ty); - } - ctx.drawImage(this.___textureBuffer,0,0); - ctx.restore(); - } else ctx.drawImage(this.___textureBuffer,0,0); - if(inColorTransform != null) this.colorTransform(new flash.geom.Rectangle(0,0,this.___textureBuffer.width,this.___textureBuffer.height),inColorTransform); + ,get_htmlText: function() { + return this.mHTMLText; } - ,draw: function(source,matrix,inColorTransform,blendMode,clipRect,smoothing) { - if(smoothing == null) smoothing = false; - this.__lease.set(this.__leaseNum++,new Date().getTime()); - source.drawToSurface(this.___textureBuffer,matrix,inColorTransform,blendMode,clipRect,smoothing); - if(inColorTransform != null) { - var rect = new flash.geom.Rectangle(); - var object = source; - rect.x = matrix != null?matrix.tx:0; - rect.y = matrix != null?matrix.ty:0; - try { - rect.width = Reflect.getProperty(source,"width"); - rect.height = Reflect.getProperty(source,"height"); - } catch( e ) { - rect.width = this.___textureBuffer.width; - rect.height = this.___textureBuffer.height; - } - this.colorTransform(rect,inColorTransform); + ,set_height: function(inValue) { + if(this.parent != null) this.parent.__invalidateBounds(); + if(this.get__boundsInvalid()) this.validateBounds(); + if(inValue != this.mHeight) { + this.mHeight = inValue; + this.Rebuild(); } + return this.mHeight; } - ,dispose: function() { - this.__clearCanvas(); - this.___textureBuffer = null; - this.__leaseNum = 0; - this.__lease = null; - this.__imageData = null; + ,get_height: function() { + return Math.max(this.mHeight,this.getBounds(this.get_stage()).height); } - ,destroy: function() { - this.___textureBuffer = null; + ,set_defaultTextFormat: function(inFmt) { + this.setTextFormat(inFmt); + this._defaultTextFormat = inFmt; + return inFmt; } - ,copyPixels: function(sourceBitmapData,sourceRect,destPoint,alphaBitmapData,alphaPoint,mergeAlpha) { - if(mergeAlpha == null) mergeAlpha = false; - if(sourceBitmapData.___textureBuffer == null || this.___textureBuffer == null || sourceBitmapData.___textureBuffer.width == 0 || sourceBitmapData.___textureBuffer.height == 0 || sourceRect.width <= 0 || sourceRect.height <= 0) return; - if(sourceRect.x + sourceRect.width > sourceBitmapData.___textureBuffer.width) sourceRect.width = sourceBitmapData.___textureBuffer.width - sourceRect.x; - if(sourceRect.y + sourceRect.height > sourceBitmapData.___textureBuffer.height) sourceRect.height = sourceBitmapData.___textureBuffer.height - sourceRect.y; - if(alphaBitmapData != null && alphaBitmapData.__transparent) { - if(alphaPoint == null) alphaPoint = new flash.geom.Point(); - var bitmapData = new flash.display.BitmapData(sourceBitmapData.___textureBuffer != null?sourceBitmapData.___textureBuffer.width:0,sourceBitmapData.___textureBuffer != null?sourceBitmapData.___textureBuffer.height:0,true); - bitmapData.copyPixels(sourceBitmapData,sourceRect,new flash.geom.Point(sourceRect.x,sourceRect.y)); - bitmapData.copyChannel(alphaBitmapData,new flash.geom.Rectangle(alphaPoint.x,alphaPoint.y,sourceRect.width,sourceRect.height),new flash.geom.Point(sourceRect.x,sourceRect.y),8,8); - sourceBitmapData = bitmapData; - } - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - if(!mergeAlpha) { - if(this.__transparent && sourceBitmapData.__transparent) { - var trpCtx = sourceBitmapData.__transparentFiller.getContext("2d"); - var trpData = trpCtx.getImageData(sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height); - ctx.putImageData(trpData,destPoint.x,destPoint.y); - } - } - ctx.drawImage(sourceBitmapData.___textureBuffer,sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height,destPoint.x,destPoint.y,sourceRect.width,sourceRect.height); - } else this.__copyPixelList[this.__copyPixelList.length] = { handle : sourceBitmapData.___textureBuffer, transparentFiller : mergeAlpha?null:sourceBitmapData.__transparentFiller, sourceX : sourceRect.x, sourceY : sourceRect.y, sourceWidth : sourceRect.width, sourceHeight : sourceRect.height, destX : destPoint.x, destY : destPoint.y}; + ,get_defaultTextFormat: function() { + return this._defaultTextFormat; } - ,copyChannel: function(sourceBitmapData,sourceRect,destPoint,sourceChannel,destChannel) { - this.rect = this.clipRect(this.rect); - if(this.rect == null) return; - if(destChannel == 8 && !this.__transparent) return; - if(sourceBitmapData.___textureBuffer == null || this.___textureBuffer == null || sourceRect.width <= 0 || sourceRect.height <= 0) return; - if(sourceRect.x + sourceRect.width > sourceBitmapData.___textureBuffer.width) sourceRect.width = sourceBitmapData.___textureBuffer.width - sourceRect.x; - if(sourceRect.y + sourceRect.height > sourceBitmapData.___textureBuffer.height) sourceRect.height = sourceBitmapData.___textureBuffer.height - sourceRect.y; - var doChannelCopy = function(imageData) { - var srcCtx = sourceBitmapData.___textureBuffer.getContext("2d"); - var srcImageData = srcCtx.getImageData(sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height); - var destIdx = -1; - if(destChannel == 8) destIdx = 3; else if(destChannel == 4) destIdx = 2; else if(destChannel == 2) destIdx = 1; else if(destChannel == 1) destIdx = 0; else throw "Invalid destination BitmapDataChannel passed to BitmapData::copyChannel."; - var pos = 4 * (Math.round(destPoint.x) + Math.round(destPoint.y) * imageData.width) + destIdx; - var boundR = Math.round(4 * (destPoint.x + sourceRect.width)); - var setPos = function(val) { - if(pos % (imageData.width * 4) > boundR - 1) pos += imageData.width * 4 - boundR; - imageData.data[pos] = val; - pos += 4; - }; - var srcIdx = -1; - if(sourceChannel == 8) srcIdx = 3; else if(sourceChannel == 4) srcIdx = 2; else if(sourceChannel == 2) srcIdx = 1; else if(sourceChannel == 1) srcIdx = 0; else throw "Invalid source BitmapDataChannel passed to BitmapData::copyChannel."; - while(srcIdx < srcImageData.data.length) { - setPos(srcImageData.data[srcIdx]); - srcIdx += 4; - } - }; - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); - doChannelCopy(imageData); - ctx.putImageData(imageData,0,0); - } else { - doChannelCopy(this.__imageData); - this.__imageDataChanged = true; - } + ,get_caretPos: function() { + return this.mInsertPos; } - ,compare: function(inBitmapTexture) { - throw "bitmapData.compare is currently not supported for HTML5"; + ,get_bottomScrollV: function() { return 0; } - ,colorTransform: function(rect,colorTransform) { - if(rect == null) return; - rect = this.clipRect(rect); - if(!this.__locked) { - this.__lease.set(this.__leaseNum++,new Date().getTime()); - var ctx = this.___textureBuffer.getContext("2d"); - var imagedata = ctx.getImageData(rect.x,rect.y,rect.width,rect.height); - var offsetX; - var _g1 = 0, _g = imagedata.data.length >> 2; - while(_g1 < _g) { - var i = _g1++; - offsetX = i * 4; - imagedata.data[offsetX] = imagedata.data[offsetX] * colorTransform.redMultiplier + colorTransform.redOffset | 0; - imagedata.data[offsetX + 1] = imagedata.data[offsetX + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset | 0; - imagedata.data[offsetX + 2] = imagedata.data[offsetX + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset | 0; - imagedata.data[offsetX + 3] = imagedata.data[offsetX + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset | 0; - } - ctx.putImageData(imagedata,rect.x,rect.y); - } else { - var s = 4 * (Math.round(rect.x) + Math.round(rect.y) * this.__imageData.width); - var offsetY; - var offsetX; - var _g1 = 0, _g = Math.round(rect.height); - while(_g1 < _g) { - var i = _g1++; - offsetY = i * this.__imageData.width; - var _g3 = 0, _g2 = Math.round(rect.width); - while(_g3 < _g2) { - var j = _g3++; - offsetX = 4 * (j + offsetY); - this.__imageData.data[s + offsetX] = this.__imageData.data[s + offsetX] * colorTransform.redMultiplier + colorTransform.redOffset | 0; - this.__imageData.data[s + offsetX + 1] = this.__imageData.data[s + offsetX + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset | 0; - this.__imageData.data[s + offsetX + 2] = this.__imageData.data[s + offsetX + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset | 0; - this.__imageData.data[s + offsetX + 3] = this.__imageData.data[s + offsetX + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset | 0; - } - } - this.__imageDataChanged = true; - } + ,set_borderColor: function(inBorderCol) { + this.borderColor = inBorderCol; + this.Rebuild(); + return inBorderCol; } - ,clone: function() { - var bitmapData = new flash.display.BitmapData(this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0,this.__transparent); - var rect = new flash.geom.Rectangle(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); - bitmapData.setPixels(rect,this.getPixels(rect)); - bitmapData.__lease.set(bitmapData.__leaseNum++,new Date().getTime()); - return bitmapData; + ,set_border: function(inBorder) { + this.border = inBorder; + this.Rebuild(); + return inBorder; } - ,clipRect: function(r) { - if(r.x < 0) { - r.width -= -r.x; - r.x = 0; - if(r.x + r.width <= 0) return null; - } - if(r.y < 0) { - r.height -= -r.y; - r.y = 0; - if(r.y + r.height <= 0) return null; - } - if(r.x + r.width >= (this.___textureBuffer != null?this.___textureBuffer.width:0)) { - r.width -= r.x + r.width - (this.___textureBuffer != null?this.___textureBuffer.width:0); - if(r.width <= 0) return null; + ,set_backgroundColor: function(inCol) { + this.backgroundColor = inCol; + this.Rebuild(); + return inCol; + } + ,set_background: function(inBack) { + this.background = inBack; + this.Rebuild(); + return inBack; + } + ,set_autoSize: function(inAutoSize) { + this.autoSize = inAutoSize; + this.Rebuild(); + return inAutoSize; + } + ,get_autoSize: function() { + return this.autoSize; + } + ,__render: function(inMask,clipRect) { + if(!this.__combinedVisible) return; + if((this.___renderFlags & 4) != 0 || (this.___renderFlags & 8) != 0) this.__validateMatrix(); + if(this.__graphics.__render(inMask,this.__filters,1,1)) { + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + this.__applyFilters(this.__graphics.__surface); + this.___renderFlags |= 32; } - if(r.y + r.height >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) { - r.height -= r.y + r.height - (this.___textureBuffer != null?this.___textureBuffer.height:0); - if(r.height <= 0) return null; + if(!this.mHTMLMode && inMask != null) { + var m = this.getSurfaceTransform(this.__graphics); + flash.Lib.__drawToSurface(this.__graphics.__surface,inMask,m,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha,clipRect,this.gridFitType != flash.text.GridFitType.PIXEL); + } else { + if((this.___renderFlags & 32) != 0) { + var m = this.getSurfaceTransform(this.__graphics); + flash.Lib.__setSurfaceTransform(this.__graphics.__surface,m); + this.___renderFlags &= -33; + } + flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha); } - return r; } - ,clear: function(color) { - this.fillRect(this.rect,color); + ,__getObjectUnderPoint: function(point) { + if(!this.get_visible()) return null; else if(this.mText.length > 1) { + var local = this.globalToLocal(point); + if(local.x < 0 || local.y < 0 || local.x > this.mMaxWidth || local.y > this.mMaxHeight) return null; else return this; + } else return flash.display.InteractiveObject.prototype.__getObjectUnderPoint.call(this,point); } - ,applyFilter: function(sourceBitmapData,sourceRect,destPoint,filter) { - if(sourceBitmapData == this && sourceRect.x == destPoint.x && sourceRect.y == destPoint.y) filter.__applyFilter(this.___textureBuffer,sourceRect); else { - var bitmapData = new flash.display.BitmapData(sourceRect.width | 0,sourceRect.height | 0); - bitmapData.copyPixels(sourceBitmapData,sourceRect,new flash.geom.Point()); - filter.__applyFilter(bitmapData.___textureBuffer); - this.copyPixels(bitmapData,bitmapData.rect,destPoint); - } + ,__getGraphics: function() { + return this.__graphics; } - ,__class__: flash.display.BitmapData - ,__properties__: {get_height:"get_height",get_transparent:"get_transparent",get_width:"get_width"} -} -flash.display.ImageDataLease = function() { -}; -$hxClasses["flash.display.ImageDataLease"] = flash.display.ImageDataLease; -flash.display.ImageDataLease.__name__ = ["flash","display","ImageDataLease"]; -flash.display.ImageDataLease.prototype = { - set: function(s,t) { - this.seed = s; - this.time = t; + ,toString: function() { + return "[TextField name=" + this.name + " id=" + this.___id + "]"; } - ,clone: function() { - var leaseClone = new flash.display.ImageDataLease(); - leaseClone.seed = this.seed; - leaseClone.time = this.time; - return leaseClone; + ,setTextFormat: function(inFmt,beginIndex,endIndex) { + if(endIndex == null) endIndex = 0; + if(beginIndex == null) beginIndex = 0; + if(inFmt.font != null) this.mFace = inFmt.font; + if(inFmt.size != null) this.mTextHeight = inFmt.size | 0; + if(inFmt.align != null) this.mAlign = inFmt.align; + if(inFmt.color != null) this.mTextColour = inFmt.color; + this.RebuildText(); + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + return this.getTextFormat(); } - ,__class__: flash.display.ImageDataLease -} -flash.display._BitmapData = {} -flash.display._BitmapData.MinstdGenerator = function(seed) { - if(seed == 0) this.value = 1; else this.value = seed; -}; -$hxClasses["flash.display._BitmapData.MinstdGenerator"] = flash.display._BitmapData.MinstdGenerator; -flash.display._BitmapData.MinstdGenerator.__name__ = ["flash","display","_BitmapData","MinstdGenerator"]; -flash.display._BitmapData.MinstdGenerator.prototype = { - nextValue: function() { - var lo = 16807 * (this.value & 65535); - var hi = 16807 * (this.value >>> 16); - lo += (hi & 32767) << 16; - if(lo < 0 || lo > -2147483648 - 1) { - lo &= -2147483648 - 1; - ++lo; + ,setSelection: function(beginIndex,endIndex) { + } + ,RenderRow: function(inRow,inY,inCharIdx,inAlign,inInsert) { + if(inInsert == null) inInsert = 0; + var h = 0; + var w = 0; + var _g = 0; + while(_g < inRow.length) { + var chr = inRow[_g]; + ++_g; + if(chr.fh > h) h = chr.fh; + w += chr.adv; } - lo += hi >>> 15; - if(lo < 0 || lo > -2147483648 - 1) { - lo &= -2147483648 - 1; - ++lo; + if(w > this.mMaxWidth) this.mMaxWidth = w; + var full_height = h * 1.2 | 0; + var align_x = 0; + var insert_x = 0; + if(inInsert != null) { + if(this.autoSize != "NONE") { + this.scrollH = 0; + insert_x = inInsert; + } else { + insert_x = inInsert - this.scrollH; + if(insert_x < 0) this.scrollH -= (this.mLimitRenderX * 3 >> 2) - insert_x; else if(insert_x > this.mLimitRenderX) this.scrollH += insert_x - (this.mLimitRenderX * 3 >> 2); + if(this.scrollH < 0) this.scrollH = 0; + } } - return this.value = lo; + if(this.autoSize == "NONE" && w <= this.mLimitRenderX) { + if(inAlign == flash.text.TextFormatAlign.CENTER) align_x = Math.round(this.mWidth) - w >> 1; else if(inAlign == flash.text.TextFormatAlign.RIGHT) align_x = Math.round(this.mWidth) - w; + } + var x_list = new Array(); + this.mLineInfo.push({ mY0 : inY, mIndex : inCharIdx - 1, mX : x_list}); + var cache_sel_font = null; + var cache_normal_font = null; + var x = align_x - this.scrollH; + var x0 = x; + var _g = 0; + while(_g < inRow.length) { + var chr = inRow[_g]; + ++_g; + var adv = chr.adv; + if(x + adv > this.mLimitRenderX) break; + x_list.push(x); + if(x >= 0) { + var font = chr.font; + if(chr.sel) { + this.__graphics.lineStyle(); + this.__graphics.beginFill(2105440); + this.__graphics.drawRect(x,inY,adv,full_height); + this.__graphics.endFill(); + if(cache_normal_font == chr.font) font = cache_sel_font; else { + font = flash.text.FontInstance.CreateSolid(chr.font.GetFace(),chr.fh,16777215,1.0); + cache_sel_font = font; + cache_normal_font = chr.font; + } + } + font.RenderChar(this.__graphics,chr.chr,x,inY + (h - chr.fh) | 0); + } + x += adv; + } + x += this.scrollH; + return full_height; } - ,__class__: flash.display._BitmapData.MinstdGenerator -} -flash.display.BitmapDataChannel = function() { } -$hxClasses["flash.display.BitmapDataChannel"] = flash.display.BitmapDataChannel; -flash.display.BitmapDataChannel.__name__ = ["flash","display","BitmapDataChannel"]; -flash.display.BlendMode = $hxClasses["flash.display.BlendMode"] = { __ename__ : true, __constructs__ : ["ADD","ALPHA","DARKEN","DIFFERENCE","ERASE","HARDLIGHT","INVERT","LAYER","LIGHTEN","MULTIPLY","NORMAL","OVERLAY","SCREEN","SUBTRACT"] } -flash.display.BlendMode.ADD = ["ADD",0]; -flash.display.BlendMode.ADD.toString = $estr; -flash.display.BlendMode.ADD.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.ALPHA = ["ALPHA",1]; -flash.display.BlendMode.ALPHA.toString = $estr; -flash.display.BlendMode.ALPHA.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.DARKEN = ["DARKEN",2]; -flash.display.BlendMode.DARKEN.toString = $estr; -flash.display.BlendMode.DARKEN.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.DIFFERENCE = ["DIFFERENCE",3]; -flash.display.BlendMode.DIFFERENCE.toString = $estr; -flash.display.BlendMode.DIFFERENCE.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.ERASE = ["ERASE",4]; -flash.display.BlendMode.ERASE.toString = $estr; -flash.display.BlendMode.ERASE.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.HARDLIGHT = ["HARDLIGHT",5]; -flash.display.BlendMode.HARDLIGHT.toString = $estr; -flash.display.BlendMode.HARDLIGHT.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.INVERT = ["INVERT",6]; -flash.display.BlendMode.INVERT.toString = $estr; -flash.display.BlendMode.INVERT.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.LAYER = ["LAYER",7]; -flash.display.BlendMode.LAYER.toString = $estr; -flash.display.BlendMode.LAYER.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.LIGHTEN = ["LIGHTEN",8]; -flash.display.BlendMode.LIGHTEN.toString = $estr; -flash.display.BlendMode.LIGHTEN.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.MULTIPLY = ["MULTIPLY",9]; -flash.display.BlendMode.MULTIPLY.toString = $estr; -flash.display.BlendMode.MULTIPLY.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.NORMAL = ["NORMAL",10]; -flash.display.BlendMode.NORMAL.toString = $estr; -flash.display.BlendMode.NORMAL.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.OVERLAY = ["OVERLAY",11]; -flash.display.BlendMode.OVERLAY.toString = $estr; -flash.display.BlendMode.OVERLAY.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.SCREEN = ["SCREEN",12]; -flash.display.BlendMode.SCREEN.toString = $estr; -flash.display.BlendMode.SCREEN.__enum__ = flash.display.BlendMode; -flash.display.BlendMode.SUBTRACT = ["SUBTRACT",13]; -flash.display.BlendMode.SUBTRACT.toString = $estr; -flash.display.BlendMode.SUBTRACT.__enum__ = flash.display.BlendMode; -flash.display.CapsStyle = $hxClasses["flash.display.CapsStyle"] = { __ename__ : true, __constructs__ : ["NONE","ROUND","SQUARE"] } -flash.display.CapsStyle.NONE = ["NONE",0]; -flash.display.CapsStyle.NONE.toString = $estr; -flash.display.CapsStyle.NONE.__enum__ = flash.display.CapsStyle; -flash.display.CapsStyle.ROUND = ["ROUND",1]; -flash.display.CapsStyle.ROUND.toString = $estr; -flash.display.CapsStyle.ROUND.__enum__ = flash.display.CapsStyle; -flash.display.CapsStyle.SQUARE = ["SQUARE",2]; -flash.display.CapsStyle.SQUARE.toString = $estr; -flash.display.CapsStyle.SQUARE.__enum__ = flash.display.CapsStyle; -flash.display.GradientType = $hxClasses["flash.display.GradientType"] = { __ename__ : true, __constructs__ : ["RADIAL","LINEAR"] } -flash.display.GradientType.RADIAL = ["RADIAL",0]; -flash.display.GradientType.RADIAL.toString = $estr; -flash.display.GradientType.RADIAL.__enum__ = flash.display.GradientType; -flash.display.GradientType.LINEAR = ["LINEAR",1]; -flash.display.GradientType.LINEAR.toString = $estr; -flash.display.GradientType.LINEAR.__enum__ = flash.display.GradientType; -flash.display.Graphics = function(inSurface) { - flash.Lib.__bootstrap(); - if(inSurface == null) { - this.__surface = js.Browser.document.createElement("canvas"); - this.__surface.width = 0; - this.__surface.height = 0; - } else this.__surface = inSurface; - this.mLastMoveID = 0; - this.mPenX = 0.0; - this.mPenY = 0.0; - this.mDrawList = new Array(); - this.mPoints = []; - this.mSolidGradient = null; - this.mBitmap = null; - this.mFilling = false; - this.mFillColour = 0; - this.mFillAlpha = 0.0; - this.mLastMoveID = 0; - this.boundsDirty = true; - this.__clearLine(); - this.mLineJobs = []; - this.__changed = true; - this.nextDrawIndex = 0; - this.__extent = new flash.geom.Rectangle(); - this.__extentWithFilters = new flash.geom.Rectangle(); - this._padding = 0.0; - this.__clearNextCycle = true; -}; -$hxClasses["flash.display.Graphics"] = flash.display.Graphics; -flash.display.Graphics.__name__ = ["flash","display","Graphics"]; -flash.display.Graphics.__detectIsPointInPathMode = function() { - var canvas = js.Browser.document.createElement("canvas"); - var ctx = canvas.getContext("2d"); - if(ctx.isPointInPath == null) return flash.display.PointInPathMode.USER_SPACE; - ctx.save(); - ctx.translate(1,0); - ctx.beginPath(); - ctx.rect(0,0,1,1); - var rv = ctx.isPointInPath(0.3,0.3)?flash.display.PointInPathMode.USER_SPACE:flash.display.PointInPathMode.DEVICE_SPACE; - ctx.restore(); - return rv; -} -flash.display.Graphics.prototype = { - __render: function(maskHandle,filters,sx,sy,clip0,clip1,clip2,clip3) { - if(sy == null) sy = 1.0; - if(sx == null) sx = 1.0; - if(!this.__changed) return false; - this.closePolygon(true); - var padding = this._padding; - if(filters != null) { + ,RebuildText: function() { + this.mParagraphs = []; + if(!this.mHTMLMode) { + var font = flash.text.FontInstance.CreateSolid(this.mFace,this.mTextHeight,this.mTextColour,1.0); + var paras = this.mText.split("\n"); var _g = 0; - while(_g < filters.length) { - var filter = filters[_g]; + while(_g < paras.length) { + var paragraph = paras[_g]; ++_g; - if(Reflect.hasField(filter,"blurX")) padding += Math.max(Reflect.field(filter,"blurX"),Reflect.field(filter,"blurY")) * 4; - } - } - this.__expandFilteredExtent(-(padding * sx) / 2,-(padding * sy) / 2); - if(this.__clearNextCycle) { - this.nextDrawIndex = 0; - this.__clearCanvas(); - this.__clearNextCycle = false; - } - if(this.__extentWithFilters.width - this.__extentWithFilters.x > this.__surface.width || this.__extentWithFilters.height - this.__extentWithFilters.y > this.__surface.height) this.__adjustSurface(sx,sy); - var ctx = (function($this) { - var $r; - try { - $r = $this.__surface.getContext("2d"); - } catch( e ) { - $r = null; + this.mParagraphs.push({ align : this.mAlign, spans : [{ font : font, text : paragraph + "\n"}]}); } - return $r; - }(this)); - if(ctx == null) return false; - if(clip0 != null) { - ctx.beginPath(); - ctx.moveTo(clip0.x * sx,clip0.y * sy); - ctx.lineTo(clip1.x * sx,clip1.y * sy); - ctx.lineTo(clip2.x * sx,clip2.y * sy); - ctx.lineTo(clip3.x * sx,clip3.y * sy); - ctx.closePath(); - ctx.clip(); } - if(filters != null) { - var _g = 0; - while(_g < filters.length) { - var filter = filters[_g]; - ++_g; - if(js.Boot.__instanceof(filter,flash.filters.DropShadowFilter)) filter.__applyFilter(this.__surface,null,true); - } + this.Rebuild(); + } + ,Rebuild: function() { + if(this.mHTMLMode) return; + this.mLineInfo = []; + this.__graphics.clear(); + if(this.background) { + this.__graphics.beginFill(this.backgroundColor); + this.__graphics.drawRect(0,0,this.get_width(),this.get_height()); + this.__graphics.endFill(); } - var len = this.mDrawList.length; - ctx.save(); - if(this.__extentWithFilters.x != 0 || this.__extentWithFilters.y != 0) ctx.translate(-this.__extentWithFilters.x * sx,-this.__extentWithFilters.y * sy); - if(sx != 1 || sy != 0) ctx.scale(sx,sy); - var doStroke = false; - var _g = this.nextDrawIndex; - while(_g < len) { - var i = _g++; - var d = this.mDrawList[len - 1 - i]; - if(d.tileJob != null) this.__drawTiles(d.tileJob.sheet,d.tileJob.drawList,d.tileJob.flags); else { - if(d.lineJobs.length > 0) { - var _g1 = 0, _g2 = d.lineJobs; - while(_g1 < _g2.length) { - var lj = _g2[_g1]; - ++_g1; - ctx.lineWidth = lj.thickness; - switch(lj.joints) { - case 0: - ctx.lineJoin = "round"; - break; - case 4096: - ctx.lineJoin = "miter"; - break; - case 8192: - ctx.lineJoin = "bevel"; - break; - } - switch(lj.caps) { - case 256: - ctx.lineCap = "round"; - break; - case 512: - ctx.lineCap = "square"; - break; - case 0: - ctx.lineCap = "butt"; - break; - } - ctx.miterLimit = lj.miter_limit; - if(lj.grad != null) ctx.strokeStyle = this.createCanvasGradient(ctx,lj.grad); else ctx.strokeStyle = this.createCanvasColor(lj.colour,lj.alpha); - ctx.beginPath(); - var _g4 = lj.point_idx0, _g3 = lj.point_idx1 + 1; - while(_g4 < _g3) { - var i1 = _g4++; - var p = d.points[i1]; - switch(p.type) { - case 0: - ctx.moveTo(p.x,p.y); - break; - case 2: - ctx.quadraticCurveTo(p.cx,p.cy,p.x,p.y); - break; - default: - ctx.lineTo(p.x,p.y); - } - } - ctx.closePath(); - doStroke = true; + this.__graphics.lineStyle(this.mTextColour); + var insert_x = null; + this.mMaxWidth = 0; + var wrap = this.mLimitRenderX = this.get_wordWrap() && !this.__inputEnabled?this.mWidth | 0:999999; + var char_idx = 0; + var h = 0; + var s0 = this.mSelStart; + var s1 = this.mSelEnd; + var _g = 0, _g1 = this.mParagraphs; + while(_g < _g1.length) { + var paragraph = _g1[_g]; + ++_g; + var row = []; + var row_width = 0; + var last_word_break = 0; + var last_word_break_width = 0; + var last_word_char_idx = 0; + var start_idx = char_idx; + var tx = 0; + var _g2 = 0, _g3 = paragraph.spans; + while(_g2 < _g3.length) { + var span = _g3[_g2]; + ++_g2; + var text = span.text; + var font = span.font; + var fh = font.get_height(); + last_word_break = row.length; + last_word_break_width = row_width; + last_word_char_idx = char_idx; + var _g5 = 0, _g4 = text.length; + while(_g5 < _g4) { + var ch = _g5++; + var g = HxOverrides.cca(text,ch); + var adv = font.__getAdvance(g); + if(g == 32) { + last_word_break = row.length; + last_word_break_width = tx; + last_word_char_idx = char_idx; } - } else { - ctx.beginPath(); - var _g1 = 0, _g2 = d.points; - while(_g1 < _g2.length) { - var p = _g2[_g1]; - ++_g1; - switch(p.type) { - case 0: - ctx.moveTo(p.x,p.y); - break; - case 2: - ctx.quadraticCurveTo(p.cx,p.cy,p.x,p.y); - break; - default: - ctx.lineTo(p.x,p.y); + if(tx + adv > wrap) { + if(last_word_break > 0) { + var row_end = row.splice(last_word_break,row.length - last_word_break); + h += this.RenderRow(row,h,start_idx,paragraph.align); + row = row_end; + tx -= last_word_break_width; + start_idx = last_word_char_idx; + last_word_break = 0; + last_word_break_width = 0; + last_word_char_idx = 0; + if(row_end.length > 0 && row_end[0].chr == 32) { + row_end.shift(); + start_idx++; + } + } else { + h += this.RenderRow(row,h,char_idx,paragraph.align); + row = []; + tx = 0; + start_idx = char_idx; } } - ctx.closePath(); + row.push({ font : font, chr : g, x : tx, fh : fh, sel : char_idx >= s0 && char_idx < s1, adv : adv}); + tx += adv; + char_idx++; } - var fillColour = d.fillColour; - var fillAlpha = d.fillAlpha; - var g = d.solidGradient; - var bitmap = d.bitmap; - if(g != null) ctx.fillStyle = this.createCanvasGradient(ctx,g); else if(bitmap != null && (bitmap.flags & 16) > 0) { - var m = bitmap.matrix; - if(m != null) ctx.transform(m.a,m.b,m.c,m.d,m.tx,m.ty); - if((bitmap.flags & 65536) == 0) { - ctx.mozImageSmoothingEnabled = false; - ctx.webkitImageSmoothingEnabled = false; - } - ctx.fillStyle = ctx.createPattern(bitmap.texture_buffer,"repeat"); - } else ctx.fillStyle = this.createCanvasColor(fillColour,Math.min(1.0,Math.max(0.0,fillAlpha))); - ctx.fill(); - if(doStroke) ctx.stroke(); - ctx.save(); - if(bitmap != null && (bitmap.flags & 16) == 0) { - ctx.clip(); - var img = bitmap.texture_buffer; - var m = bitmap.matrix; - if(m != null) ctx.transform(m.a,m.b,m.c,m.d,m.tx,m.ty); - ctx.drawImage(img,0,0); - } - ctx.restore(); } - } - ctx.restore(); - this.__changed = false; - this.nextDrawIndex = len > 0?len - 1:0; - this.mDrawList = []; - return true; - } - ,__mediaSurface: function(surface) { - this.__surface = surface; - } - ,__invalidate: function() { - this.__changed = true; - this.__clearNextCycle = true; - } - ,__hitTest: function(inX,inY) { - var ctx = (function($this) { - var $r; - try { - $r = $this.__surface.getContext("2d"); - } catch( e ) { - $r = null; + if(row.length > 0) { + h += this.RenderRow(row,h,start_idx,paragraph.align,insert_x); + insert_x = null; } - return $r; - }(this)); - if(ctx == null) return false; - if(ctx.isPointInPath(inX,inY)) return true; else if(this.mDrawList.length == 0 && this.__extent.width > 0 && this.__extent.height > 0) return true; - return false; - } - ,__expandStandardExtent: function(x,y,thickness) { - if(thickness == null) thickness = 0; - if(this._padding > 0) { - this.__extent.width -= this._padding; - this.__extent.height -= this._padding; - } - if(thickness != null && thickness > this._padding) this._padding = thickness; - var maxX, minX, maxY, minY; - minX = this.__extent.x; - minY = this.__extent.y; - maxX = this.__extent.width + minX; - maxY = this.__extent.height + minY; - maxX = x > maxX?x:maxX; - minX = x < minX?x:minX; - maxY = y > maxY?y:maxY; - minY = y < minY?y:minY; - this.__extent.x = minX; - this.__extent.y = minY; - this.__extent.width = maxX - minX + this._padding; - this.__extent.height = maxY - minY + this._padding; - this.boundsDirty = true; - } - ,__expandFilteredExtent: function(x,y) { - var maxX, minX, maxY, minY; - minX = this.__extent.x; - minY = this.__extent.y; - maxX = this.__extent.width + minX; - maxY = this.__extent.height + minY; - maxX = x > maxX?x:maxX; - minX = x < minX?x:minX; - maxY = y > maxY?y:maxY; - minY = y < minY?y:minY; - this.__extentWithFilters.x = minX; - this.__extentWithFilters.y = minY; - this.__extentWithFilters.width = maxX - minX; - this.__extentWithFilters.height = maxY - minY; - } - ,__drawTiles: function(sheet,tileData,flags) { - if(flags == null) flags = 0; - var useScale = (flags & 1) > 0; - var useRotation = (flags & 2) > 0; - var useTransform = (flags & 16) > 0; - var useRGB = (flags & 4) > 0; - var useAlpha = (flags & 8) > 0; - if(useTransform) { - useScale = false; - useRotation = false; - } - var scaleIndex = 0; - var rotationIndex = 0; - var rgbIndex = 0; - var alphaIndex = 0; - var transformIndex = 0; - var numValues = 3; - if(useScale) { - scaleIndex = numValues; - numValues++; - } - if(useRotation) { - rotationIndex = numValues; - numValues++; - } - if(useTransform) { - transformIndex = numValues; - numValues += 4; - } - if(useRGB) { - rgbIndex = numValues; - numValues += 3; } - if(useAlpha) { - alphaIndex = numValues; - numValues++; + var w = this.mMaxWidth; + if(h < this.mTextHeight) h = this.mTextHeight; + this.mMaxHeight = h; + var _g = this; + switch(_g.autoSize) { + case "LEFT": + break; + case "RIGHT": + var x0 = this.get_x() + this.get_width(); + this.set_x(this.mWidth - x0); + break; + case "CENTER": + var x0 = this.get_x() + this.get_width() / 2; + this.set_x(this.mWidth / 2 - x0); + break; + default: + if(this.get_wordWrap()) this.set_height(h); } - var totalCount = tileData.length; - var itemCount = totalCount / numValues | 0; - var index = 0; - var rect = null; - var center = null; - var previousTileID = -1; - var surface = sheet.__bitmap.___textureBuffer; - var ctx = (function($this) { - var $r; - try { - $r = $this.__surface.getContext("2d"); - } catch( e ) { - $r = null; - } - return $r; - }(this)); - if(ctx != null) while(index < totalCount) { - var tileID = tileData[index + 2] | 0; - if(tileID != previousTileID) { - rect = sheet.__tileRects[tileID]; - center = sheet.__centerPoints[tileID]; - previousTileID = tileID; - } - if(rect != null && center != null) { - ctx.save(); - ctx.translate(tileData[index],tileData[index + 1]); - if(useRotation) ctx.rotate(tileData[index + rotationIndex]); - var scale = 1.0; - if(useScale) scale = tileData[index + scaleIndex]; - if(useTransform) ctx.transform(tileData[index + transformIndex],tileData[index + transformIndex + 1],tileData[index + transformIndex + 2],tileData[index + transformIndex + 3],0,0); - if(useAlpha) ctx.globalAlpha = tileData[index + alphaIndex]; - ctx.drawImage(surface,rect.x,rect.y,rect.width,rect.height,-center.x * scale,-center.y * scale,rect.width * scale,rect.height * scale); - ctx.restore(); - } - index += numValues; + if(this.border) { + this.__graphics.endFill(); + this.__graphics.lineStyle(1,this.borderColor,1,true); + this.__graphics.drawRect(.5,.5,this.get_width() - .5,this.get_height() - .5); } } - ,__drawEllipse: function(x,y,rx,ry) { - this.moveTo(x + rx,y); - this.curveTo(rx + x,-0.4142 * ry + y,0.7071 * rx + x,-0.7071 * ry + y); - this.curveTo(0.4142 * rx + x,-ry + y,x,-ry + y); - this.curveTo(-0.4142 * rx + x,-ry + y,-0.7071 * rx + x,-0.7071 * ry + y); - this.curveTo(-rx + x,-0.4142 * ry + y,-rx + x,y); - this.curveTo(-rx + x,0.4142 * ry + y,-0.7071 * rx + x,0.7071 * ry + y); - this.curveTo(-0.4142 * rx + x,ry + y,x,ry + y); - this.curveTo(0.4142 * rx + x,ry + y,0.7071 * rx + x,0.7071 * ry + y); - this.curveTo(rx + x,0.4142 * ry + y,rx + x,y); - } - ,__clearLine: function() { - this.mCurrentLine = new flash.display.LineJob(null,-1,-1,0.0,0.0,0,1,0,256,3,3.0); + ,getTextFormat: function(beginIndex,endIndex) { + if(endIndex == null) endIndex = 0; + if(beginIndex == null) beginIndex = 0; + return new flash.text.TextFormat(this.mFace,this.mTextHeight,this.mTextColour); } - ,__clearCanvas: function() { - if(this.__surface != null) { - var ctx = (function($this) { - var $r; - try { - $r = $this.__surface.getContext("2d"); - } catch( e ) { - $r = null; - } - return $r; - }(this)); - if(ctx != null) ctx.clearRect(0,0,this.__surface.width,this.__surface.height); + ,getLineIndexAtPoint: function(inX,inY) { + if(this.mLineInfo.length < 1) return -1; + if(inY <= 0) return 0; + var _g1 = 0, _g = this.mLineInfo.length; + while(_g1 < _g) { + var l = _g1++; + if(this.mLineInfo[l].mY0 > inY) return l == 0?0:l - 1; } + return this.mLineInfo.length - 1; } - ,__adjustSurface: function(sx,sy) { - if(sy == null) sy = 1.0; - if(sx == null) sx = 1.0; - if(Reflect.field(this.__surface,"getContext") != null) { - var width = Math.ceil((this.__extentWithFilters.width - this.__extentWithFilters.x) * sx); - var height = Math.ceil((this.__extentWithFilters.height - this.__extentWithFilters.y) * sy); - if(width <= 5000 && height <= 5000) { - var dstCanvas = js.Browser.document.createElement("canvas"); - dstCanvas.width = width; - dstCanvas.height = height; - flash.Lib.__drawToSurface(this.__surface,dstCanvas); - if(flash.Lib.__isOnStage(this.__surface)) { - flash.Lib.__appendSurface(dstCanvas); - flash.Lib.__copyStyle(this.__surface,dstCanvas); - flash.Lib.__swapSurface(this.__surface,dstCanvas); - flash.Lib.__removeSurface(this.__surface); - if(this.__surface.id != null) flash.Lib.__setSurfaceId(dstCanvas,this.__surface.id); - } - this.__surface = dstCanvas; - } + ,getCharIndexAtPoint: function(inX,inY) { + var li = this.getLineIndexAtPoint(inX,inY); + if(li < 0) return -1; + var line = this.mLineInfo[li]; + var idx = line.mIndex; + var _g = 0, _g1 = line.mX; + while(_g < _g1.length) { + var x = _g1[_g]; + ++_g; + if(x > inX) return idx; + idx++; } + return idx; } - ,moveTo: function(inX,inY) { - this.mPenX = inX; - this.mPenY = inY; - this.__expandStandardExtent(inX,inY); - if(!this.mFilling) this.closePolygon(false); else { - this.addLineSegment(); - this.mLastMoveID = this.mPoints.length; - this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); - } + ,getCharBoundaries: function(a) { + return null; } - ,lineTo: function(inX,inY) { - var pid = this.mPoints.length; - if(pid == 0) { - this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); - pid++; - } - this.mPenX = inX; - this.mPenY = inY; - this.__expandStandardExtent(inX,inY,this.mCurrentLine.thickness); - this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,1)); - if(this.mCurrentLine.grad != null || this.mCurrentLine.alpha > 0) { - if(this.mCurrentLine.point_idx0 < 0) this.mCurrentLine.point_idx0 = pid - 1; - this.mCurrentLine.point_idx1 = pid; - } - if(!this.mFilling) this.closePolygon(false); + ,DecodeColour: function(col) { + return Std.parseInt("0x" + HxOverrides.substr(col,1,null)); } - ,lineStyle: function(thickness,color,alpha,pixelHinting,scaleMode,caps,joints,miterLimit) { - this.addLineSegment(); - if(thickness == null) { - this.__clearLine(); - return; - } else { - this.mCurrentLine.grad = null; - this.mCurrentLine.thickness = thickness; - this.mCurrentLine.colour = color == null?0:color; - this.mCurrentLine.alpha = alpha == null?1.0:alpha; - this.mCurrentLine.miter_limit = miterLimit == null?3.0:miterLimit; - this.mCurrentLine.pixel_hinting = pixelHinting == null || !pixelHinting?0:16384; - } - if(caps != null) { - switch( (caps)[1] ) { - case 1: - this.mCurrentLine.caps = 256; - break; - case 2: - this.mCurrentLine.caps = 512; - break; - case 0: - this.mCurrentLine.caps = 0; - break; + ,ConvertHTMLToText: function(inUnSetHTML) { + this.mText = ""; + var _g = 0, _g1 = this.mParagraphs; + while(_g < _g1.length) { + var paragraph = _g1[_g]; + ++_g; + var _g2 = 0, _g3 = paragraph.spans; + while(_g2 < _g3.length) { + var span = _g3[_g2]; + ++_g2; + this.mText += span.text; } } - this.mCurrentLine.scale_mode = 3; - if(scaleMode != null) { - switch( (scaleMode)[1] ) { - case 2: - this.mCurrentLine.scale_mode = 3; - break; - case 3: - this.mCurrentLine.scale_mode = 1; - break; - case 0: - this.mCurrentLine.scale_mode = 2; - break; - case 1: - this.mCurrentLine.scale_mode = 0; - break; - } + if(inUnSetHTML) { + this.mHTMLMode = false; + this.RebuildText(); } - this.mCurrentLine.joints = 0; - if(joints != null) { - switch( (joints)[1] ) { - case 1: - this.mCurrentLine.joints = 0; - break; - case 0: - this.mCurrentLine.joints = 4096; - break; - case 2: - this.mCurrentLine.joints = 8192; - break; - } + } + ,appendText: function(newText) { + var _g = this; + _g.set_text(_g.get_text() + newText); + } + ,__class__: flash.text.TextField + ,__properties__: $extend(flash.display.InteractiveObject.prototype.__properties__,{set_autoSize:"set_autoSize",set_background:"set_background",set_backgroundColor:"set_backgroundColor",set_border:"set_border",set_borderColor:"set_borderColor",get_bottomScrollV:"get_bottomScrollV",get_caretPos:"get_caretPos",set_defaultTextFormat:"set_defaultTextFormat",get_defaultTextFormat:"get_defaultTextFormat",set_htmlText:"set_htmlText",get_htmlText:"get_htmlText",get_maxScrollH:"get_maxScrollH",get_maxScrollV:"get_maxScrollV",get_numLines:"get_numLines",set_text:"set_text",get_text:"get_text",set_textColor:"set_textColor",get_textColor:"get_textColor",get_textHeight:"get_textHeight",get_textWidth:"get_textWidth",set_type:"set_type",get_type:"get_type",set_wordWrap:"set_wordWrap",get_wordWrap:"get_wordWrap"}) +}); +com.engine.ui = {} +com.engine.ui.Text = function(x,y,caption,size,color) { + if(color == null) color = -1; + if(size == null) size = 12; + if(y == null) y = 10; + if(x == null) x = 10; + flash.text.TextField.call(this); + this.set_x(x); + this.set_y(y); + this.set_width(caption.length * size); + this.selectable = false; + this.set_defaultTextFormat(new flash.text.TextFormat("arial",size,color)); + this.set_text(caption); +}; +$hxClasses["com.engine.ui.Text"] = com.engine.ui.Text; +com.engine.ui.Text.__name__ = ["com","engine","ui","Text"]; +com.engine.ui.Text.__super__ = flash.text.TextField; +com.engine.ui.Text.prototype = $extend(flash.text.TextField.prototype,{ + __class__: com.engine.ui.Text +}); +var haxe = {} +haxe.Timer = function() { } +$hxClasses["haxe.Timer"] = haxe.Timer; +haxe.Timer.__name__ = ["haxe","Timer"]; +haxe.Timer.stamp = function() { + return new Date().getTime() / 1000; +} +flash.Lib = function(rootElement,width,height) { + this.mKilled = false; + this.__scr = rootElement; + if(this.__scr == null) throw "Root element not found"; + this.__scr.style.setProperty("overflow","hidden",""); + this.__scr.style.setProperty("position","absolute",""); + if(this.__scr.style.getPropertyValue("width") != "100%") this.__scr.style.width = width + "px"; + if(this.__scr.style.getPropertyValue("height") != "100%") this.__scr.style.height = height + "px"; +}; +$hxClasses["flash.Lib"] = flash.Lib; +flash.Lib.__name__ = ["flash","Lib"]; +flash.Lib.__properties__ = {get_current:"get_current"} +flash.Lib.addCallback = function(functionName,closure) { + flash.Lib.mMe.__scr[functionName] = closure; +} +flash.Lib["as"] = function(v,c) { + return js.Boot.__instanceof(v,c)?v:null; +} +flash.Lib.attach = function(name) { + return new flash.display.MovieClip(); +} +flash.Lib.getTimer = function() { + return (haxe.Timer.stamp() - flash.Lib.starttime) * 1000 | 0; +} +flash.Lib.getURL = function(request,target) { + if(target == null) target = "_blank"; + window.open(request.url,target); +} +flash.Lib.preventDefaultTouchMove = function() { + js.Browser.document.addEventListener("touchmove",function(evt) { + evt.preventDefault(); + },false); +} +flash.Lib.Run = function(tgt,width,height) { + flash.Lib.mMe = new flash.Lib(tgt,width,height); + var _g1 = 0, _g = tgt.attributes.length; + while(_g1 < _g) { + var i = _g1++; + var attr = tgt.attributes.item(i); + if(StringTools.startsWith(attr.name,"data-")) { + if(attr.name == "data-" + "framerate") flash.Lib.__getStage().set_frameRate(Std.parseFloat(attr.value)); } } - ,lineGradientStyle: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { - this.mCurrentLine.grad = this.createGradient(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio); + var _g = 0, _g1 = flash.Lib.HTML_TOUCH_EVENT_TYPES; + while(_g < _g1.length) { + var type = _g1[_g]; + ++_g; + tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); } - ,getContext: function() { + var _g = 0, _g1 = flash.Lib.HTML_TOUCH_ALT_EVENT_TYPES; + while(_g < _g1.length) { + var type = _g1[_g]; + ++_g; + tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + } + var _g = 0, _g1 = flash.Lib.HTML_DIV_EVENT_TYPES; + while(_g < _g1.length) { + var type = _g1[_g]; + ++_g; + tgt.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + } + if(Reflect.hasField(js.Browser.window,"on" + "devicemotion")) js.Browser.window.addEventListener("devicemotion",($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + if(Reflect.hasField(js.Browser.window,"on" + "orientationchange")) js.Browser.window.addEventListener("orientationchange",($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),true); + var _g = 0, _g1 = flash.Lib.HTML_WINDOW_EVENT_TYPES; + while(_g < _g1.length) { + var type = _g1[_g]; + ++_g; + js.Browser.window.addEventListener(type,($_=flash.Lib.__getStage(),$bind($_,$_.__queueStageEvent)),false); + } + if(tgt.style.backgroundColor != null && tgt.style.backgroundColor != "") flash.Lib.__getStage().set_backgroundColor(flash.Lib.__parseColor(tgt.style.backgroundColor,function(res,pos,cur) { + return pos == 0?res | cur << 16:pos == 1?res | cur << 8:pos == 2?res | cur:(function($this) { + var $r; + throw "pos should be 0-2"; + return $r; + }(this)); + })); else flash.Lib.__getStage().set_backgroundColor(16777215); + flash.Lib.get_current().get_graphics().beginFill(flash.Lib.__getStage().get_backgroundColor()); + flash.Lib.get_current().get_graphics().drawRect(0,0,width,height); + flash.Lib.__setSurfaceId(flash.Lib.get_current().get_graphics().__surface,"Root MovieClip"); + flash.Lib.__getStage().__updateNextWake(); + return flash.Lib.mMe; +} +flash.Lib.setUserScalable = function(isScalable) { + if(isScalable == null) isScalable = true; + var meta = js.Browser.document.createElement("meta"); + meta.name = "viewport"; + meta.content = "user-scalable=" + (isScalable?"yes":"no"); +} +flash.Lib.trace = function(arg) { + if(window.console != null) window.console.log(arg); +} +flash.Lib.__appendSurface = function(surface,before,after) { + if(flash.Lib.mMe.__scr != null) { + surface.style.setProperty("position","absolute",""); + surface.style.setProperty("left","0px",""); + surface.style.setProperty("top","0px",""); + surface.style.setProperty("transform-origin","0 0",""); + surface.style.setProperty("-moz-transform-origin","0 0",""); + surface.style.setProperty("-webkit-transform-origin","0 0",""); + surface.style.setProperty("-o-transform-origin","0 0",""); + surface.style.setProperty("-ms-transform-origin","0 0",""); try { - return this.__surface.getContext("2d"); + if(surface.localName == "canvas") surface.onmouseover = surface.onselectstart = function() { + return false; + }; } catch( e ) { - return null; } + if(before != null) before.parentNode.insertBefore(surface,before); else if(after != null && after.nextSibling != null) after.parentNode.insertBefore(surface,after.nextSibling); else flash.Lib.mMe.__scr.appendChild(surface); } - ,flush: function() { - this.closePolygon(true); +} +flash.Lib.__appendText = function(surface,container,text,wrap,isHtml) { + var _g1 = 0, _g = surface.childNodes.length; + while(_g1 < _g) { + var i = _g1++; + surface.removeChild(surface.childNodes[i]); } - ,endFill: function() { - this.closePolygon(true); + if(isHtml) container.innerHTML = text; else container.appendChild(js.Browser.document.createTextNode(text)); + container.style.setProperty("position","relative",""); + container.style.setProperty("cursor","default",""); + if(!wrap) container.style.setProperty("white-space","nowrap",""); + surface.appendChild(container); +} +flash.Lib.__bootstrap = function() { + if(flash.Lib.mMe == null) { + var target = js.Browser.document.getElementById("haxe:openfl"); + if(target == null) target = js.Browser.document.createElement("div"); + var agent = navigator.userAgent; + if(agent.indexOf("BlackBerry") > -1 && target.style.height == "100%") target.style.height = screen.height + "px"; + if(agent.indexOf("Android") > -1) { + var version = Std.parseFloat(HxOverrides.substr(agent,agent.indexOf("Android") + 8,3)); + if(version <= 2.3) flash.Lib.mForce2DTransform = true; + } + flash.Lib.Run(target,flash.Lib.__getWidth(),flash.Lib.__getHeight()); } - ,drawTiles: function(sheet,tileData,smooth,flags) { - if(flags == null) flags = 0; - if(smooth == null) smooth = false; - this.__expandStandardExtent(flash.Lib.get_current().get_stage().get_stageWidth(),flash.Lib.get_current().get_stage().get_stageHeight()); - this.addDrawable(new flash.display.Drawable(null,null,null,null,null,null,new flash.display.TileJob(sheet,tileData,flags))); - this.__changed = true; +} +flash.Lib.__copyStyle = function(src,tgt) { + tgt.id = src.id; + var _g = 0, _g1 = ["left","top","transform","transform-origin","-moz-transform","-moz-transform-origin","-webkit-transform","-webkit-transform-origin","-o-transform","-o-transform-origin","opacity","display"]; + while(_g < _g1.length) { + var prop = _g1[_g]; + ++_g; + tgt.style.setProperty(prop,src.style.getPropertyValue(prop),""); } - ,drawRoundRect: function(x,y,width,height,rx,ry) { - if(ry == null) ry = -1; - if(ry == -1) ry = rx; - rx *= 0.5; - ry *= 0.5; - var w = width * 0.5; - x += w; - if(rx > w) rx = w; - var lw = w - rx; - var w_ = lw + rx * Math.sin(Math.PI / 4); - var cw_ = lw + rx * Math.tan(Math.PI / 8); - var h = height * 0.5; - y += h; - if(ry > h) ry = h; - var lh = h - ry; - var h_ = lh + ry * Math.sin(Math.PI / 4); - var ch_ = lh + ry * Math.tan(Math.PI / 8); - this.closePolygon(false); - this.moveTo(x + w,y + lh); - this.curveTo(x + w,y + ch_,x + w_,y + h_); - this.curveTo(x + cw_,y + h,x + lw,y + h); - this.lineTo(x - lw,y + h); - this.curveTo(x - cw_,y + h,x - w_,y + h_); - this.curveTo(x - w,y + ch_,x - w,y + lh); - this.lineTo(x - w,y - lh); - this.curveTo(x - w,y - ch_,x - w_,y - h_); - this.curveTo(x - cw_,y - h,x - lw,y - h); - this.lineTo(x + lw,y - h); - this.curveTo(x + cw_,y - h,x + w_,y - h_); - this.curveTo(x + w,y - ch_,x + w,y - lh); - this.lineTo(x + w,y + lh); - this.closePolygon(false); - } - ,drawRect: function(x,y,width,height) { - this.closePolygon(false); - this.moveTo(x,y); - this.lineTo(x + width,y); - this.lineTo(x + width,y + height); - this.lineTo(x,y + height); - this.lineTo(x,y); - this.closePolygon(false); +} +flash.Lib.__createSurfaceAnimationCSS = function(surface,data,template,templateFunc,fps,discrete,infinite) { + if(infinite == null) infinite = false; + if(discrete == null) discrete = false; + if(fps == null) fps = 25; + if(surface.id == null || surface.id == "") { + flash.Lib.trace("Failed to create a CSS Style tag for a surface without an id attribute"); + return null; } - ,drawGraphicsData: function(points) { - var $it0 = ((function(_e) { - return function() { - return $iterator(flash._Vector.Vector_Impl_)(_e); - }; - })(points))(); - while( $it0.hasNext() ) { - var data = $it0.next(); - if(data == null) this.mFilling = true; else switch(data.__graphicsDataType) { - case flash.display.GraphicsDataType.STROKE: - var stroke = data; - if(stroke.fill == null) this.lineStyle(stroke.thickness,0,1.,stroke.pixelHinting,stroke.scaleMode,stroke.caps,stroke.joints,stroke.miterLimit); else switch(stroke.fill.__graphicsFillType) { - case flash.display.GraphicsFillType.SOLID_FILL: - var fill = stroke.fill; - this.lineStyle(stroke.thickness,fill.color,fill.alpha,stroke.pixelHinting,stroke.scaleMode,stroke.caps,stroke.joints,stroke.miterLimit); - break; - case flash.display.GraphicsFillType.GRADIENT_FILL: - var fill = stroke.fill; - this.lineGradientStyle(fill.type,fill.colors,fill.alphas,fill.ratios,fill.matrix,fill.spreadMethod,fill.interpolationMethod,fill.focalPointRatio); - break; - } - break; - case flash.display.GraphicsDataType.PATH: - var path = data; - var j = 0; - var _g1 = 0, _g = flash._Vector.Vector_Impl_.get_length(path.commands); - while(_g1 < _g) { - var i = _g1++; - var command = path.commands[i]; - switch(command) { - case 1: - this.moveTo(path.data[j],path.data[j + 1]); - j = j + 2; - break; - case 2: - this.lineTo(path.data[j],path.data[j + 1]); - j = j + 2; - break; - case 3: - this.curveTo(path.data[j],path.data[j + 1],path.data[j + 2],path.data[j + 3]); - j = j + 4; - break; - } - } - break; - case flash.display.GraphicsDataType.SOLID: - var fill = data; - this.beginFill(fill.color,fill.alpha); - break; - case flash.display.GraphicsDataType.GRADIENT: - var fill = data; - this.beginGradientFill(fill.type,fill.colors,fill.alphas,fill.ratios,fill.matrix,fill.spreadMethod,fill.interpolationMethod,fill.focalPointRatio); - break; - } - } + var style = null; + if(surface.getAttribute("data-openfl-anim") != null) style = js.Browser.document.getElementById(surface.getAttribute("data-openfl-anim")); else { + style = flash.Lib.mMe.__scr.appendChild(js.Browser.document.createElement("style")); + style.sheet.id = "__openfl_anim_" + surface.id + "__"; + surface.setAttribute("data-openfl-anim",style.sheet.id); } - ,drawEllipse: function(x,y,rx,ry) { - this.closePolygon(false); - rx /= 2; - ry /= 2; - this.__drawEllipse(x + rx,y + ry,rx,ry); - this.closePolygon(false); + var keyframeStylesheetRule = ""; + var _g1 = 0, _g = data.length; + while(_g1 < _g) { + var i = _g1++; + var perc = i / (data.length - 1) * 100; + var frame = data[i]; + keyframeStylesheetRule += perc + "% { " + template.execute(templateFunc(frame)) + " } "; } - ,drawCircle: function(x,y,rad) { - this.closePolygon(false); - this.__drawEllipse(x,y,rad,rad); - this.closePolygon(false); + var animationDiscreteRule = discrete?"steps(::steps::, end)":""; + var animationInfiniteRule = infinite?"infinite":""; + var animationTpl = ""; + var _g = 0, _g1 = ["animation","-moz-animation","-webkit-animation","-o-animation","-ms-animation"]; + while(_g < _g1.length) { + var prefix = _g1[_g]; + ++_g; + animationTpl += prefix + ": ::id:: ::duration::s " + animationDiscreteRule + " " + animationInfiniteRule + "; "; } - ,curveTo: function(inCX,inCY,inX,inY) { - var pid = this.mPoints.length; - if(pid == 0) { - this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); - pid++; - } - this.mPenX = inX; - this.mPenY = inY; - this.__expandStandardExtent(inX,inY,this.mCurrentLine.thickness); - this.mPoints.push(new flash.display.GfxPoint(inX,inY,inCX,inCY,2)); - if(this.mCurrentLine.grad != null || this.mCurrentLine.alpha > 0) { - if(this.mCurrentLine.point_idx0 < 0) this.mCurrentLine.point_idx0 = pid - 1; - this.mCurrentLine.point_idx1 = pid; + var animationStylesheetRule = new haxe.Template(animationTpl).execute({ id : surface.id, duration : data.length / fps, steps : 1}); + var rules = style.sheet.rules != null?style.sheet.rules:style.sheet.cssRules; + var _g = 0, _g1 = ["","-moz-","-webkit-","-o-","-ms-"]; + while(_g < _g1.length) { + var variant = _g1[_g]; + ++_g; + try { + style.sheet.insertRule("@" + variant + "keyframes " + surface.id + " {" + keyframeStylesheetRule + "}",rules.length); + } catch( e ) { } } - ,createGradient: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { - var points = new Array(); - var _g1 = 0, _g = colors.length; - while(_g1 < _g) { - var i = _g1++; - points.push(new flash.display.GradPoint(colors[i],alphas[i],ratios[i])); - } - var flags = 0; - if(type == flash.display.GradientType.RADIAL) flags |= 1; - if(spreadMethod == flash.display.SpreadMethod.REPEAT) flags |= 2; else if(spreadMethod == flash.display.SpreadMethod.REFLECT) flags |= 4; - if(matrix == null) { - matrix = new flash.geom.Matrix(); - matrix.createGradientBox(25,25); - } else matrix = matrix.clone(); - var focal = focalPointRatio == null?0:focalPointRatio; - return new flash.display.Grad(points,matrix,flags,focal); + style.sheet.insertRule("#" + surface.id + " { " + animationStylesheetRule + " } ",rules.length); + return style; +} +flash.Lib.__designMode = function(mode) { + js.Browser.document.designMode = mode?"on":"off"; +} +flash.Lib.__disableFullScreen = function() { +} +flash.Lib.__disableRightClick = function() { + if(flash.Lib.mMe != null) try { + flash.Lib.mMe.__scr.oncontextmenu = function() { + return false; + }; + } catch( e ) { + flash.Lib.trace("Disable right click not supported in this browser."); } - ,createCanvasGradient: function(ctx,g) { - var gradient; - var matrix = g.matrix; - if((g.flags & 1) == 0) { - var p1 = matrix.transformPoint(new flash.geom.Point(-819.2,0)); - var p2 = matrix.transformPoint(new flash.geom.Point(819.2,0)); - gradient = ctx.createLinearGradient(p1.x,p1.y,p2.x,p2.y); - } else { - var p1 = matrix.transformPoint(new flash.geom.Point(g.focal * 819.2,0)); - var p2 = matrix.transformPoint(new flash.geom.Point(0,819.2)); - gradient = ctx.createRadialGradient(p1.x,p1.y,0,p2.x,p1.y,p2.y); +} +flash.Lib.__drawClippedImage = function(surface,tgtCtx,clipRect) { + if(clipRect != null) { + if(clipRect.x < 0) { + clipRect.width += clipRect.x; + clipRect.x = 0; } - var _g = 0, _g1 = g.points; - while(_g < _g1.length) { - var point = _g1[_g]; - ++_g; - var color = this.createCanvasColor(point.col,point.alpha); - var pos = point.ratio / 255; - gradient.addColorStop(pos,color); + if(clipRect.y < 0) { + clipRect.height += clipRect.y; + clipRect.y = 0; } - return gradient; + if(clipRect.width > surface.width - clipRect.x) clipRect.width = surface.width - clipRect.x; + if(clipRect.height > surface.height - clipRect.y) clipRect.height = surface.height - clipRect.y; + tgtCtx.drawImage(surface,clipRect.x,clipRect.y,clipRect.width,clipRect.height,clipRect.x,clipRect.y,clipRect.width,clipRect.height); + } else tgtCtx.drawImage(surface,0,0); +} +flash.Lib.__drawSurfaceRect = function(surface,tgt,x,y,rect) { + var tgtCtx = tgt.getContext("2d"); + tgt.width = rect.width; + tgt.height = rect.height; + tgtCtx.drawImage(surface,rect.x,rect.y,rect.width,rect.height,0,0,rect.width,rect.height); + tgt.style.left = x + "px"; + tgt.style.top = y + "px"; +} +flash.Lib.__drawToSurface = function(surface,tgt,matrix,alpha,clipRect,smoothing) { + if(smoothing == null) smoothing = true; + if(alpha == null) alpha = 1.0; + var srcCtx = surface.getContext("2d"); + var tgtCtx = tgt.getContext("2d"); + tgtCtx.globalAlpha = alpha; + flash.Lib.__setImageSmoothing(tgtCtx,smoothing); + if(surface.width > 0 && surface.height > 0) { + if(matrix != null) { + tgtCtx.save(); + if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1) tgtCtx.translate(matrix.tx,matrix.ty); else tgtCtx.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.tx,matrix.ty); + flash.Lib.__drawClippedImage(surface,tgtCtx,clipRect); + tgtCtx.restore(); + } else flash.Lib.__drawClippedImage(surface,tgtCtx,clipRect); } - ,createCanvasColor: function(color,alpha) { - var r = (16711680 & color) >> 16; - var g = (65280 & color) >> 8; - var b = 255 & color; - return "rgba" + "(" + r + "," + g + "," + b + "," + alpha + ")"; +} +flash.Lib.__enableFullScreen = function() { + if(flash.Lib.mMe != null) { + var origWidth = flash.Lib.mMe.__scr.style.getPropertyValue("width"); + var origHeight = flash.Lib.mMe.__scr.style.getPropertyValue("height"); + flash.Lib.mMe.__scr.style.setProperty("width","100%",""); + flash.Lib.mMe.__scr.style.setProperty("height","100%",""); + flash.Lib.__disableFullScreen = function() { + flash.Lib.mMe.__scr.style.setProperty("width",origWidth,""); + flash.Lib.mMe.__scr.style.setProperty("height",origHeight,""); + }; } - ,closePolygon: function(inCancelFill) { - var l = this.mPoints.length; - if(l > 0) { - if(l > 1) { - if(this.mFilling && l > 2) { - if(this.mPoints[this.mLastMoveID].x != this.mPoints[l - 1].x || this.mPoints[this.mLastMoveID].y != this.mPoints[l - 1].y) this.lineTo(this.mPoints[this.mLastMoveID].x,this.mPoints[this.mLastMoveID].y); - } - this.addLineSegment(); - var drawable = new flash.display.Drawable(this.mPoints,this.mFillColour,this.mFillAlpha,this.mSolidGradient,this.mBitmap,this.mLineJobs,null); - this.addDrawable(drawable); - } - this.mLineJobs = []; - this.mPoints = []; - } - if(inCancelFill) { - this.mFillAlpha = 0; - this.mSolidGradient = null; - this.mBitmap = null; - this.mFilling = false; - } - this.__changed = true; - } - ,clear: function() { - this.__clearLine(); - this.mPenX = 0.0; - this.mPenY = 0.0; - this.mDrawList = new Array(); - this.nextDrawIndex = 0; - this.mPoints = []; - this.mSolidGradient = null; - this.mFilling = false; - this.mFillColour = 0; - this.mFillAlpha = 0.0; - this.mLastMoveID = 0; - this.__clearNextCycle = true; - this.boundsDirty = true; - this.__extent.x = 0.0; - this.__extent.y = 0.0; - this.__extent.width = 0.0; - this.__extent.height = 0.0; - this._padding = 0.0; - this.mLineJobs = []; - } - ,blit: function(inTexture) { - this.closePolygon(true); - var ctx = (function($this) { - var $r; - try { - $r = $this.__surface.getContext("2d"); - } catch( e ) { - $r = null; - } - return $r; - }(this)); - if(ctx != null) ctx.drawImage(inTexture.___textureBuffer,this.mPenX,this.mPenY); - } - ,beginGradientFill: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { - this.closePolygon(true); - this.mFilling = true; - this.mBitmap = null; - this.mSolidGradient = this.createGradient(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio); - } - ,beginFill: function(color,alpha) { - this.closePolygon(true); - this.mFillColour = color; - this.mFillAlpha = alpha == null?1.0:alpha; - this.mFilling = true; - this.mSolidGradient = null; - this.mBitmap = null; - } - ,beginBitmapFill: function(bitmap,matrix,in_repeat,in_smooth) { - if(in_smooth == null) in_smooth = false; - if(in_repeat == null) in_repeat = true; - this.closePolygon(true); - var repeat = in_repeat == null?true:in_repeat; - var smooth = in_smooth == null?false:in_smooth; - this.mFilling = true; - this.mSolidGradient = null; - this.__expandStandardExtent(bitmap.___textureBuffer != null?bitmap.___textureBuffer.width:0,bitmap.___textureBuffer != null?bitmap.___textureBuffer.height:0); - this.mBitmap = { texture_buffer : bitmap.___textureBuffer, matrix : matrix == null?matrix:matrix.clone(), flags : (repeat?16:0) | (smooth?65536:0)}; - } - ,addLineSegment: function() { - if(this.mCurrentLine.point_idx1 > 0) this.mLineJobs.push(new flash.display.LineJob(this.mCurrentLine.grad,this.mCurrentLine.point_idx0,this.mCurrentLine.point_idx1,this.mCurrentLine.thickness,this.mCurrentLine.alpha,this.mCurrentLine.colour,this.mCurrentLine.pixel_hinting,this.mCurrentLine.joints,this.mCurrentLine.caps,this.mCurrentLine.scale_mode,this.mCurrentLine.miter_limit)); - this.mCurrentLine.point_idx0 = this.mCurrentLine.point_idx1 = -1; - } - ,addDrawable: function(inDrawable) { - if(inDrawable == null) return; - this.mDrawList.unshift(inDrawable); +} +flash.Lib.__enableRightClick = function() { + if(flash.Lib.mMe != null) try { + flash.Lib.mMe.__scr.oncontextmenu = null; + } catch( e ) { + flash.Lib.trace("Enable right click not supported in this browser."); } - ,__class__: flash.display.Graphics } -flash.display.Drawable = function(inPoints,inFillColour,inFillAlpha,inSolidGradient,inBitmap,inLineJobs,inTileJob) { - this.points = inPoints; - this.fillColour = inFillColour; - this.fillAlpha = inFillAlpha; - this.solidGradient = inSolidGradient; - this.bitmap = inBitmap; - this.lineJobs = inLineJobs; - this.tileJob = inTileJob; -}; -$hxClasses["flash.display.Drawable"] = flash.display.Drawable; -flash.display.Drawable.__name__ = ["flash","display","Drawable"]; -flash.display.Drawable.prototype = { - __class__: flash.display.Drawable +flash.Lib.__fullScreenHeight = function() { + return js.Browser.window.innerHeight; } -flash.display.GfxPoint = function(inX,inY,inCX,inCY,inType) { - this.x = inX; - this.y = inY; - this.cx = inCX; - this.cy = inCY; - this.type = inType; -}; -$hxClasses["flash.display.GfxPoint"] = flash.display.GfxPoint; -flash.display.GfxPoint.__name__ = ["flash","display","GfxPoint"]; -flash.display.GfxPoint.prototype = { - __class__: flash.display.GfxPoint +flash.Lib.__fullScreenWidth = function() { + return js.Browser.window.innerWidth; } -flash.display.Grad = function(inPoints,inMatrix,inFlags,inFocal) { - this.points = inPoints; - this.matrix = inMatrix; - this.flags = inFlags; - this.focal = inFocal; -}; -$hxClasses["flash.display.Grad"] = flash.display.Grad; -flash.display.Grad.__name__ = ["flash","display","Grad"]; -flash.display.Grad.prototype = { - __class__: flash.display.Grad +flash.Lib.__getHeight = function() { + var tgt = flash.Lib.mMe != null?flash.Lib.mMe.__scr:js.Browser.document.getElementById("haxe:openfl"); + return tgt != null && tgt.clientHeight > 0?tgt.clientHeight:500; } -flash.display.GradPoint = function(inCol,inAlpha,inRatio) { - this.col = inCol; - this.alpha = inAlpha; - this.ratio = inRatio; -}; -$hxClasses["flash.display.GradPoint"] = flash.display.GradPoint; -flash.display.GradPoint.__name__ = ["flash","display","GradPoint"]; -flash.display.GradPoint.prototype = { - __class__: flash.display.GradPoint +flash.Lib.__getStage = function() { + if(flash.Lib.mStage == null) { + var width = flash.Lib.__getWidth(); + var height = flash.Lib.__getHeight(); + flash.Lib.mStage = new flash.display.Stage(width,height); + } + return flash.Lib.mStage; } -flash.display.LineJob = function(inGrad,inPoint_idx0,inPoint_idx1,inThickness,inAlpha,inColour,inPixel_hinting,inJoints,inCaps,inScale_mode,inMiter_limit) { - this.grad = inGrad; - this.point_idx0 = inPoint_idx0; - this.point_idx1 = inPoint_idx1; - this.thickness = inThickness; - this.alpha = inAlpha; - this.colour = inColour; - this.pixel_hinting = inPixel_hinting; - this.joints = inJoints; - this.caps = inCaps; - this.scale_mode = inScale_mode; - this.miter_limit = inMiter_limit; -}; -$hxClasses["flash.display.LineJob"] = flash.display.LineJob; -flash.display.LineJob.__name__ = ["flash","display","LineJob"]; -flash.display.LineJob.prototype = { - __class__: flash.display.LineJob +flash.Lib.__getWidth = function() { + var tgt = flash.Lib.mMe != null?flash.Lib.mMe.__scr:js.Browser.document.getElementById("haxe:openfl"); + return tgt != null && tgt.clientWidth > 0?tgt.clientWidth:500; } -flash.display.PointInPathMode = $hxClasses["flash.display.PointInPathMode"] = { __ename__ : true, __constructs__ : ["USER_SPACE","DEVICE_SPACE"] } -flash.display.PointInPathMode.USER_SPACE = ["USER_SPACE",0]; -flash.display.PointInPathMode.USER_SPACE.toString = $estr; -flash.display.PointInPathMode.USER_SPACE.__enum__ = flash.display.PointInPathMode; -flash.display.PointInPathMode.DEVICE_SPACE = ["DEVICE_SPACE",1]; -flash.display.PointInPathMode.DEVICE_SPACE.toString = $estr; -flash.display.PointInPathMode.DEVICE_SPACE.__enum__ = flash.display.PointInPathMode; -flash.display.TileJob = function(sheet,drawList,flags) { - this.sheet = sheet; - this.drawList = drawList; - this.flags = flags; -}; -$hxClasses["flash.display.TileJob"] = flash.display.TileJob; -flash.display.TileJob.__name__ = ["flash","display","TileJob"]; -flash.display.TileJob.prototype = { - __class__: flash.display.TileJob +flash.Lib.__isOnStage = function(surface) { + var p = surface; + while(p != null && p != flash.Lib.mMe.__scr) p = p.parentNode; + return p == flash.Lib.mMe.__scr; } -flash.display.IGraphicsFill = function() { } -$hxClasses["flash.display.IGraphicsFill"] = flash.display.IGraphicsFill; -flash.display.IGraphicsFill.__name__ = ["flash","display","IGraphicsFill"]; -flash.display.IGraphicsFill.prototype = { - __class__: flash.display.IGraphicsFill +flash.Lib.__parseColor = function(str,cb) { + var re = new EReg("rgb\\(([0-9]*), ?([0-9]*), ?([0-9]*)\\)",""); + var hex = new EReg("#([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])",""); + if(re.match(str)) { + var col = 0; + var _g = 1; + while(_g < 4) { + var pos = _g++; + var v = Std.parseInt(re.matched(pos)); + col = cb(col,pos - 1,v); + } + return col; + } else if(hex.match(str)) { + var col = 0; + var _g = 1; + while(_g < 4) { + var pos = _g++; + var v = "0x" + hex.matched(pos) & 255; + v = cb(col,pos - 1,v); + } + return col; + } else throw "Cannot parse color '" + str + "'."; } -flash.display.IGraphicsData = function() { } -$hxClasses["flash.display.IGraphicsData"] = flash.display.IGraphicsData; -flash.display.IGraphicsData.__name__ = ["flash","display","IGraphicsData"]; -flash.display.IGraphicsData.prototype = { - __class__: flash.display.IGraphicsData +flash.Lib.__removeSurface = function(surface) { + if(flash.Lib.mMe.__scr != null) { + var anim = surface.getAttribute("data-openfl-anim"); + if(anim != null) { + var style = js.Browser.document.getElementById(anim); + if(style != null) flash.Lib.mMe.__scr.removeChild(style); + } + if(surface.parentNode != null) surface.parentNode.removeChild(surface); + } + return surface; } -flash.display.GraphicsGradientFill = function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { - if(focalPointRatio == null) focalPointRatio = 0; - this.type = type; - this.colors = colors; - this.alphas = alphas; - this.ratios = ratios; - this.matrix = matrix; - this.spreadMethod = spreadMethod; - this.interpolationMethod = interpolationMethod; - this.focalPointRatio = focalPointRatio; - this.__graphicsDataType = flash.display.GraphicsDataType.GRADIENT; - this.__graphicsFillType = flash.display.GraphicsFillType.GRADIENT_FILL; -}; -$hxClasses["flash.display.GraphicsGradientFill"] = flash.display.GraphicsGradientFill; -flash.display.GraphicsGradientFill.__name__ = ["flash","display","GraphicsGradientFill"]; -flash.display.GraphicsGradientFill.__interfaces__ = [flash.display.IGraphicsFill,flash.display.IGraphicsData]; -flash.display.GraphicsGradientFill.prototype = { - __class__: flash.display.GraphicsGradientFill +flash.Lib.__setSurfaceBorder = function(surface,color,size) { + surface.style.setProperty("border-color","#" + StringTools.hex(color),""); + surface.style.setProperty("border-style","solid",""); + surface.style.setProperty("border-width",size + "px",""); + surface.style.setProperty("border-collapse","collapse",""); } -flash.display.IGraphicsPath = function() { } -$hxClasses["flash.display.IGraphicsPath"] = flash.display.IGraphicsPath; -flash.display.IGraphicsPath.__name__ = ["flash","display","IGraphicsPath"]; -flash.display.GraphicsPath = function(commands,data,winding) { - this.commands = commands; - this.data = data; - this.winding = winding; - this.__graphicsDataType = flash.display.GraphicsDataType.PATH; -}; -$hxClasses["flash.display.GraphicsPath"] = flash.display.GraphicsPath; -flash.display.GraphicsPath.__name__ = ["flash","display","GraphicsPath"]; -flash.display.GraphicsPath.__interfaces__ = [flash.display.IGraphicsPath,flash.display.IGraphicsData]; -flash.display.GraphicsPath.prototype = { - moveTo: function(x,y) { - if(this.commands != null && this.data != null) { - flash._Vector.Vector_Impl_.push(this.commands,1); - flash._Vector.Vector_Impl_.push(this.data,x); - flash._Vector.Vector_Impl_.push(this.data,y); - } - } - ,lineTo: function(x,y) { - if(this.commands != null && this.data != null) { - flash._Vector.Vector_Impl_.push(this.commands,2); - flash._Vector.Vector_Impl_.push(this.data,x); - flash._Vector.Vector_Impl_.push(this.data,y); - } - } - ,curveTo: function(controlX,controlY,anchorX,anchorY) { - if(this.commands != null && this.data != null) { - flash._Vector.Vector_Impl_.push(this.commands,3); - flash._Vector.Vector_Impl_.push(this.data,anchorX); - flash._Vector.Vector_Impl_.push(this.data,anchorY); - flash._Vector.Vector_Impl_.push(this.data,controlX); - flash._Vector.Vector_Impl_.push(this.data,controlY); - } - } - ,__class__: flash.display.GraphicsPath +flash.Lib.__setSurfaceClipping = function(surface,rect) { } -flash.display.GraphicsPathCommand = function() { } -$hxClasses["flash.display.GraphicsPathCommand"] = flash.display.GraphicsPathCommand; -flash.display.GraphicsPathCommand.__name__ = ["flash","display","GraphicsPathCommand"]; -flash.display.GraphicsPathWinding = $hxClasses["flash.display.GraphicsPathWinding"] = { __ename__ : true, __constructs__ : ["EVEN_ODD","NON_ZERO"] } -flash.display.GraphicsPathWinding.EVEN_ODD = ["EVEN_ODD",0]; -flash.display.GraphicsPathWinding.EVEN_ODD.toString = $estr; -flash.display.GraphicsPathWinding.EVEN_ODD.__enum__ = flash.display.GraphicsPathWinding; -flash.display.GraphicsPathWinding.NON_ZERO = ["NON_ZERO",1]; -flash.display.GraphicsPathWinding.NON_ZERO.toString = $estr; -flash.display.GraphicsPathWinding.NON_ZERO.__enum__ = flash.display.GraphicsPathWinding; -flash.display.GraphicsSolidFill = function(color,alpha) { - if(alpha == null) alpha = 1; - if(color == null) color = 0; - this.alpha = alpha; - this.color = color; - this.__graphicsDataType = flash.display.GraphicsDataType.SOLID; - this.__graphicsFillType = flash.display.GraphicsFillType.SOLID_FILL; -}; -$hxClasses["flash.display.GraphicsSolidFill"] = flash.display.GraphicsSolidFill; -flash.display.GraphicsSolidFill.__name__ = ["flash","display","GraphicsSolidFill"]; -flash.display.GraphicsSolidFill.__interfaces__ = [flash.display.IGraphicsFill,flash.display.IGraphicsData]; -flash.display.GraphicsSolidFill.prototype = { - __class__: flash.display.GraphicsSolidFill +flash.Lib.__setSurfaceFont = function(surface,font,bold,size,color,align,lineHeight) { + surface.style.setProperty("font-family",font,""); + surface.style.setProperty("font-weight",Std.string(bold),""); + surface.style.setProperty("color","#" + StringTools.hex(color),""); + surface.style.setProperty("font-size",size + "px",""); + surface.style.setProperty("text-align",align,""); + surface.style.setProperty("line-height",lineHeight + "px",""); } -flash.display.IGraphicsStroke = function() { } -$hxClasses["flash.display.IGraphicsStroke"] = flash.display.IGraphicsStroke; -flash.display.IGraphicsStroke.__name__ = ["flash","display","IGraphicsStroke"]; -flash.display.GraphicsStroke = function(thickness,pixelHinting,scaleMode,caps,joints,miterLimit,fill) { - if(miterLimit == null) miterLimit = 3; - if(pixelHinting == null) pixelHinting = false; - if(thickness == null) thickness = 0.0; - this.caps = caps != null?caps:null; - this.fill = fill; - this.joints = joints != null?joints:null; - this.miterLimit = miterLimit; - this.pixelHinting = pixelHinting; - this.scaleMode = scaleMode != null?scaleMode:null; - this.thickness = thickness; - this.__graphicsDataType = flash.display.GraphicsDataType.STROKE; -}; -$hxClasses["flash.display.GraphicsStroke"] = flash.display.GraphicsStroke; -flash.display.GraphicsStroke.__name__ = ["flash","display","GraphicsStroke"]; -flash.display.GraphicsStroke.__interfaces__ = [flash.display.IGraphicsStroke,flash.display.IGraphicsData]; -flash.display.GraphicsStroke.prototype = { - __class__: flash.display.GraphicsStroke +flash.Lib.__setSurfaceOpacity = function(surface,alpha) { + surface.style.setProperty("opacity",Std.string(alpha),""); } -flash.display.GraphicsDataType = $hxClasses["flash.display.GraphicsDataType"] = { __ename__ : true, __constructs__ : ["STROKE","SOLID","GRADIENT","PATH"] } -flash.display.GraphicsDataType.STROKE = ["STROKE",0]; -flash.display.GraphicsDataType.STROKE.toString = $estr; -flash.display.GraphicsDataType.STROKE.__enum__ = flash.display.GraphicsDataType; -flash.display.GraphicsDataType.SOLID = ["SOLID",1]; -flash.display.GraphicsDataType.SOLID.toString = $estr; -flash.display.GraphicsDataType.SOLID.__enum__ = flash.display.GraphicsDataType; -flash.display.GraphicsDataType.GRADIENT = ["GRADIENT",2]; -flash.display.GraphicsDataType.GRADIENT.toString = $estr; -flash.display.GraphicsDataType.GRADIENT.__enum__ = flash.display.GraphicsDataType; -flash.display.GraphicsDataType.PATH = ["PATH",3]; -flash.display.GraphicsDataType.PATH.toString = $estr; -flash.display.GraphicsDataType.PATH.__enum__ = flash.display.GraphicsDataType; -flash.display.GraphicsFillType = $hxClasses["flash.display.GraphicsFillType"] = { __ename__ : true, __constructs__ : ["SOLID_FILL","GRADIENT_FILL"] } -flash.display.GraphicsFillType.SOLID_FILL = ["SOLID_FILL",0]; -flash.display.GraphicsFillType.SOLID_FILL.toString = $estr; -flash.display.GraphicsFillType.SOLID_FILL.__enum__ = flash.display.GraphicsFillType; -flash.display.GraphicsFillType.GRADIENT_FILL = ["GRADIENT_FILL",1]; -flash.display.GraphicsFillType.GRADIENT_FILL.toString = $estr; -flash.display.GraphicsFillType.GRADIENT_FILL.__enum__ = flash.display.GraphicsFillType; -flash.display.InterpolationMethod = $hxClasses["flash.display.InterpolationMethod"] = { __ename__ : true, __constructs__ : ["RGB","LINEAR_RGB"] } -flash.display.InterpolationMethod.RGB = ["RGB",0]; -flash.display.InterpolationMethod.RGB.toString = $estr; -flash.display.InterpolationMethod.RGB.__enum__ = flash.display.InterpolationMethod; -flash.display.InterpolationMethod.LINEAR_RGB = ["LINEAR_RGB",1]; -flash.display.InterpolationMethod.LINEAR_RGB.toString = $estr; -flash.display.InterpolationMethod.LINEAR_RGB.__enum__ = flash.display.InterpolationMethod; -flash.display.JointStyle = $hxClasses["flash.display.JointStyle"] = { __ename__ : true, __constructs__ : ["MITER","ROUND","BEVEL"] } -flash.display.JointStyle.MITER = ["MITER",0]; -flash.display.JointStyle.MITER.toString = $estr; -flash.display.JointStyle.MITER.__enum__ = flash.display.JointStyle; -flash.display.JointStyle.ROUND = ["ROUND",1]; -flash.display.JointStyle.ROUND.toString = $estr; -flash.display.JointStyle.ROUND.__enum__ = flash.display.JointStyle; -flash.display.JointStyle.BEVEL = ["BEVEL",2]; -flash.display.JointStyle.BEVEL.toString = $estr; -flash.display.JointStyle.BEVEL.__enum__ = flash.display.JointStyle; -flash.display.LineScaleMode = $hxClasses["flash.display.LineScaleMode"] = { __ename__ : true, __constructs__ : ["HORIZONTAL","NONE","NORMAL","VERTICAL"] } -flash.display.LineScaleMode.HORIZONTAL = ["HORIZONTAL",0]; -flash.display.LineScaleMode.HORIZONTAL.toString = $estr; -flash.display.LineScaleMode.HORIZONTAL.__enum__ = flash.display.LineScaleMode; -flash.display.LineScaleMode.NONE = ["NONE",1]; -flash.display.LineScaleMode.NONE.toString = $estr; -flash.display.LineScaleMode.NONE.__enum__ = flash.display.LineScaleMode; -flash.display.LineScaleMode.NORMAL = ["NORMAL",2]; -flash.display.LineScaleMode.NORMAL.toString = $estr; -flash.display.LineScaleMode.NORMAL.__enum__ = flash.display.LineScaleMode; -flash.display.LineScaleMode.VERTICAL = ["VERTICAL",3]; -flash.display.LineScaleMode.VERTICAL.toString = $estr; -flash.display.LineScaleMode.VERTICAL.__enum__ = flash.display.LineScaleMode; -flash.display.Loader = function() { - flash.display.Sprite.call(this); - this.contentLoaderInfo = flash.display.LoaderInfo.create(this); -}; -$hxClasses["flash.display.Loader"] = flash.display.Loader; -flash.display.Loader.__name__ = ["flash","display","Loader"]; -flash.display.Loader.__super__ = flash.display.Sprite; -flash.display.Loader.prototype = $extend(flash.display.Sprite.prototype,{ - handleLoad: function(e) { - e.currentTarget = this; - this.content.__invalidateBounds(); - this.content.__render(null,null); - this.contentLoaderInfo.removeEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad)); +flash.Lib.__setSurfacePadding = function(surface,padding,margin,display) { + surface.style.setProperty("padding",padding + "px",""); + surface.style.setProperty("margin",margin + "px",""); + surface.style.setProperty("top",padding + 2 + "px",""); + surface.style.setProperty("right",padding + 1 + "px",""); + surface.style.setProperty("left",padding + 1 + "px",""); + surface.style.setProperty("bottom",padding + 1 + "px",""); + surface.style.setProperty("display",display?"inline":"block",""); +} +flash.Lib.__setSurfaceTransform = function(surface,matrix) { + if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1 && surface.getAttribute("data-openfl-anim") == null) { + surface.style.left = matrix.tx + "px"; + surface.style.top = matrix.ty + "px"; + surface.style.setProperty("transform","",""); + surface.style.setProperty("-moz-transform","",""); + surface.style.setProperty("-webkit-transform","",""); + surface.style.setProperty("-o-transform","",""); + surface.style.setProperty("-ms-transform","",""); + } else { + surface.style.left = "0px"; + surface.style.top = "0px"; + surface.style.setProperty("transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); + surface.style.setProperty("-moz-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + "px, " + matrix.ty + "px)",""); + if(!flash.Lib.mForce2DTransform) surface.style.setProperty("-webkit-transform","matrix3d(" + matrix.a + ", " + matrix.b + ", " + "0, 0, " + matrix.c + ", " + matrix.d + ", " + "0, 0, 0, 0, 1, 0, " + matrix.tx + ", " + matrix.ty + ", " + "0, 1" + ")",""); else surface.style.setProperty("-webkit-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); + surface.style.setProperty("-o-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); + surface.style.setProperty("-ms-transform","matrix(" + matrix.a + ", " + matrix.b + ", " + matrix.c + ", " + matrix.d + ", " + matrix.tx + ", " + matrix.ty + ")",""); } - ,validateBounds: function() { - if(this.get__boundsInvalid()) { - flash.display.Sprite.prototype.validateBounds.call(this); - if(this.mImage != null) { - var r = new flash.geom.Rectangle(0,0,this.mImage.get_width(),this.mImage.get_height()); - if(r.width != 0 || r.height != 0) { - if(this.__boundsRect.width == 0 && this.__boundsRect.height == 0) this.__boundsRect = r.clone(); else this.__boundsRect.extendBounds(r); - } - } - if(this.scale9Grid != null) { - this.__boundsRect.width *= this.__scaleX; - this.__boundsRect.height *= this.__scaleY; - this.__width = this.__boundsRect.width; - this.__height = this.__boundsRect.height; - } else { - this.__width = this.__boundsRect.width * this.__scaleX; - this.__height = this.__boundsRect.height * this.__scaleY; +} +flash.Lib.__setSurfaceZIndexAfter = function(surface1,surface2) { + if(surface1 != null && surface2 != null) { + if(surface1.parentNode != surface2.parentNode && surface2.parentNode != null) surface2.parentNode.appendChild(surface1); + if(surface2.parentNode != null) { + var nextSibling = surface2.nextSibling; + if(surface1.previousSibling != surface2) { + var swap = flash.Lib.__removeSurface(surface1); + if(nextSibling == null) surface2.parentNode.appendChild(swap); else surface2.parentNode.insertBefore(swap,nextSibling); } } } - ,toString: function() { - return "[Loader name=" + this.name + " id=" + this.___id + "]"; - } - ,loadBytes: function(buffer) { - var _g = this; - try { - this.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad),false,2147483647); - flash.display.BitmapData.loadFromBytes(buffer,null,function(bmd) { - _g.content = new flash.display.Bitmap(bmd); - _g.contentLoaderInfo.content = _g.content; - _g.addChild(_g.content); - var evt = new flash.events.Event(flash.events.Event.COMPLETE); - evt.currentTarget = _g; - _g.contentLoaderInfo.dispatchEvent(evt); - }); - } catch( e ) { - console.log("Error " + Std.string(e)); - var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); - evt.currentTarget = this; - this.contentLoaderInfo.dispatchEvent(evt); +} +flash.Lib.__swapSurface = function(surface1,surface2) { + var parent1 = surface1.parentNode; + var parent2 = surface2.parentNode; + if(parent1 != null && parent2 != null) { + if(parent1 == parent2) { + var next1 = surface1.nextSibling; + var next2 = surface2.nextSibling; + if(next1 == surface2) parent1.insertBefore(surface2,surface1); else if(next2 == surface1) parent1.insertBefore(surface1,surface2); else { + parent1.replaceChild(surface2,surface1); + if(next2 != null) parent1.insertBefore(surface1,next2); else parent1.appendChild(surface1); + } + } else { + var next2 = surface2.nextSibling; + parent1.replaceChild(surface2,surface1); + if(next2 != null) parent2.insertBefore(surface1,next2); else parent2.appendChild(surface1); } } - ,load: function(request,context) { - var extension = ""; - var parts = request.url.split("."); - if(parts.length > 0) extension = parts[parts.length - 1].toLowerCase(); - var transparent = true; - this.contentLoaderInfo.url = request.url; - if(request.contentType == null && request.contentType != "") this.contentLoaderInfo.contentType = (function($this) { - var $r; - switch(extension) { - case "swf": - $r = "application/x-shockwave-flash"; - break; - case "jpg":case "jpeg": - $r = (function($this) { - var $r; - transparent = false; - $r = "image/jpeg"; - return $r; - }($this)); - break; - case "png": - $r = "image/png"; - break; - case "gif": - $r = "image/gif"; - break; - default: - $r = "application/x-www-form-urlencoded"; - } - return $r; - }(this)); else this.contentLoaderInfo.contentType = request.contentType; - this.mImage = new flash.display.BitmapData(0,0,transparent); - try { - this.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad),false,2147483647); - this.mImage.__loadFromFile(request.url,this.contentLoaderInfo); - this.content = new flash.display.Bitmap(this.mImage); - this.contentLoaderInfo.content = this.content; - this.addChild(this.content); - } catch( e ) { - console.log("Error " + Std.string(e)); - var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); - evt.currentTarget = this; - this.contentLoaderInfo.dispatchEvent(evt); - return; - } - if(this.mShape == null) { - this.mShape = new flash.display.Shape(); - this.addChild(this.mShape); +} +flash.Lib.__setContentEditable = function(surface,contentEditable) { + if(contentEditable == null) contentEditable = true; + surface.setAttribute("contentEditable",contentEditable?"true":"false"); +} +flash.Lib.__setCursor = function(type) { + if(flash.Lib.mMe != null) flash.Lib.mMe.__scr.style.cursor = (function($this) { + var $r; + switch( (type)[1] ) { + case 0: + $r = "pointer"; + break; + case 1: + $r = "text"; + break; + default: + $r = "default"; } - } - ,__class__: flash.display.Loader -}); -flash.display.LoaderInfo = function() { - flash.events.EventDispatcher.call(this); - this.applicationDomain = flash.system.ApplicationDomain.currentDomain; - this.bytesLoaded = 0; - this.bytesTotal = 0; - this.childAllowsParent = true; - this.parameters = { }; -}; -$hxClasses["flash.display.LoaderInfo"] = flash.display.LoaderInfo; -flash.display.LoaderInfo.__name__ = ["flash","display","LoaderInfo"]; -flash.display.LoaderInfo.create = function(ldr) { - var li = new flash.display.LoaderInfo(); - if(ldr != null) li.loader = ldr; else li.url = ""; - return li; + return $r; + }(this)); } -flash.display.LoaderInfo.__super__ = flash.events.EventDispatcher; -flash.display.LoaderInfo.prototype = $extend(flash.events.EventDispatcher.prototype,{ - __class__: flash.display.LoaderInfo -}); -flash.display.MovieClip = function() { - flash.display.Sprite.call(this); - this.enabled = true; - this.__currentFrame = 0; - this.__totalFrames = 0; - this.loaderInfo = flash.display.LoaderInfo.create(null); -}; -$hxClasses["flash.display.MovieClip"] = flash.display.MovieClip; -flash.display.MovieClip.__name__ = ["flash","display","MovieClip"]; -flash.display.MovieClip.__super__ = flash.display.Sprite; -flash.display.MovieClip.prototype = $extend(flash.display.Sprite.prototype,{ - get_totalFrames: function() { - return this.__totalFrames; - } - ,get_framesLoaded: function() { - return this.__totalFrames; - } - ,get_currentFrame: function() { - return this.__currentFrame; - } - ,toString: function() { - return "[MovieClip name=" + this.name + " id=" + this.___id + "]"; - } - ,stop: function() { - } - ,prevFrame: function() { +flash.Lib.__setImageSmoothing = function(context,enabled) { + var _g = 0, _g1 = ["imageSmoothingEnabled","mozImageSmoothingEnabled","webkitImageSmoothingEnabled"]; + while(_g < _g1.length) { + var variant = _g1[_g]; + ++_g; + context[variant] = enabled; } - ,play: function() { +} +flash.Lib.__setSurfaceAlign = function(surface,align) { + surface.style.setProperty("text-align",align,""); +} +flash.Lib.__setSurfaceId = function(surface,name) { + var regex = new EReg("[^a-zA-Z0-9\\-]","g"); + surface.id = regex.replace(name,"_"); +} +flash.Lib.__setSurfaceRotation = function(surface,rotate) { + surface.style.setProperty("transform","rotate(" + rotate + "deg)",""); + surface.style.setProperty("-moz-transform","rotate(" + rotate + "deg)",""); + surface.style.setProperty("-webkit-transform","rotate(" + rotate + "deg)",""); + surface.style.setProperty("-o-transform","rotate(" + rotate + "deg)",""); + surface.style.setProperty("-ms-transform","rotate(" + rotate + "deg)",""); +} +flash.Lib.__setSurfaceScale = function(surface,scale) { + surface.style.setProperty("transform","scale(" + scale + ")",""); + surface.style.setProperty("-moz-transform","scale(" + scale + ")",""); + surface.style.setProperty("-webkit-transform","scale(" + scale + ")",""); + surface.style.setProperty("-o-transform","scale(" + scale + ")",""); + surface.style.setProperty("-ms-transform","scale(" + scale + ")",""); +} +flash.Lib.__setSurfaceSpritesheetAnimation = function(surface,spec,fps) { + if(spec.length == 0) return surface; + var div = js.Browser.document.createElement("div"); + div.style.backgroundImage = "url(" + surface.toDataURL("image/png") + ")"; + div.id = surface.id; + var keyframeTpl = new haxe.Template("background-position: ::left::px ::top::px; width: ::width::px; height: ::height::px; "); + var templateFunc = function(frame) { + return { left : -frame.x, top : -frame.y, width : frame.width, height : frame.height}; + }; + flash.Lib.__createSurfaceAnimationCSS(div,spec,keyframeTpl,templateFunc,fps,true,true); + if(flash.Lib.__isOnStage(surface)) { + flash.Lib.__appendSurface(div); + flash.Lib.__copyStyle(surface,div); + flash.Lib.__swapSurface(surface,div); + flash.Lib.__removeSurface(surface); + } else flash.Lib.__copyStyle(surface,div); + return div; +} +flash.Lib.__setSurfaceVisible = function(surface,visible) { + if(visible) surface.style.setProperty("display","block",""); else surface.style.setProperty("display","none",""); +} +flash.Lib.__setTextDimensions = function(surface,width,height,align) { + surface.style.setProperty("width",width + "px",""); + surface.style.setProperty("height",height + "px",""); + surface.style.setProperty("overflow","hidden",""); + surface.style.setProperty("text-align",align,""); +} +flash.Lib.__surfaceHitTest = function(surface,x,y) { + var _g1 = 0, _g = surface.childNodes.length; + while(_g1 < _g) { + var i = _g1++; + var node = surface.childNodes[i]; + if(x >= node.offsetLeft && x <= node.offsetLeft + node.offsetWidth && y >= node.offsetTop && y <= node.offsetTop + node.offsetHeight) return true; } - ,nextFrame: function() { + return false; +} +flash.Lib.get_current = function() { + if(flash.Lib.mMainClassRoot == null) { + flash.Lib.mMainClassRoot = new flash.display.MovieClip(); + flash.Lib.mCurrent = flash.Lib.mMainClassRoot; + flash.Lib.__getStage().addChild(flash.Lib.mCurrent); } - ,gotoAndStop: function(frame,scene) { - if(scene == null) scene = ""; + return flash.Lib.mMainClassRoot; +} +flash.Lib.prototype = { + __class__: flash.Lib +} +flash._Lib = {} +flash._Lib.CursorType = $hxClasses["flash._Lib.CursorType"] = { __ename__ : true, __constructs__ : ["Pointer","Text","Default"] } +flash._Lib.CursorType.Pointer = ["Pointer",0]; +flash._Lib.CursorType.Pointer.toString = $estr; +flash._Lib.CursorType.Pointer.__enum__ = flash._Lib.CursorType; +flash._Lib.CursorType.Text = ["Text",1]; +flash._Lib.CursorType.Text.toString = $estr; +flash._Lib.CursorType.Text.__enum__ = flash._Lib.CursorType; +flash._Lib.CursorType.Default = ["Default",2]; +flash._Lib.CursorType.Default.toString = $estr; +flash._Lib.CursorType.Default.__enum__ = flash._Lib.CursorType; +flash._Vector = {} +flash._Vector.Vector_Impl_ = function() { } +$hxClasses["flash._Vector.Vector_Impl_"] = flash._Vector.Vector_Impl_; +flash._Vector.Vector_Impl_.__name__ = ["flash","_Vector","Vector_Impl_"]; +flash._Vector.Vector_Impl_.__properties__ = {set_fixed:"set_fixed",get_fixed:"get_fixed",set_length:"set_length",get_length:"get_length"} +flash._Vector.Vector_Impl_._new = function(length,fixed) { + return new Array(); +} +flash._Vector.Vector_Impl_.concat = function(this1,a) { + return this1.concat(a); +} +flash._Vector.Vector_Impl_.copy = function(this1) { + return this1.slice(); +} +flash._Vector.Vector_Impl_.iterator = function(this1) { + return HxOverrides.iter(this1); +} +flash._Vector.Vector_Impl_.join = function(this1,sep) { + return this1.join(sep); +} +flash._Vector.Vector_Impl_.pop = function(this1) { + return this1.pop(); +} +flash._Vector.Vector_Impl_.push = function(this1,x) { + return this1.push(x); +} +flash._Vector.Vector_Impl_.reverse = function(this1) { + this1.reverse(); +} +flash._Vector.Vector_Impl_.shift = function(this1) { + return this1.shift(); +} +flash._Vector.Vector_Impl_.unshift = function(this1,x) { + this1.unshift(x); +} +flash._Vector.Vector_Impl_.slice = function(this1,pos,end) { + return this1.slice(pos,end); +} +flash._Vector.Vector_Impl_.sort = function(this1,f) { + this1.sort(f); +} +flash._Vector.Vector_Impl_.splice = function(this1,pos,len) { + return this1.splice(pos,len); +} +flash._Vector.Vector_Impl_.toString = function(this1) { + return this1.toString(); +} +flash._Vector.Vector_Impl_.indexOf = function(this1,x,from) { + if(from == null) from = 0; + var _g1 = from, _g = this1.length; + while(_g1 < _g) { + var i = _g1++; + if(this1[i] == x) return i; } - ,gotoAndPlay: function(frame,scene) { - if(scene == null) scene = ""; + return -1; +} +flash._Vector.Vector_Impl_.lastIndexOf = function(this1,x,from) { + if(from == null) from = 0; + var i = this1.length - 1; + while(i >= from) { + if(this1[i] == x) return i; + i--; } - ,__class__: flash.display.MovieClip - ,__properties__: $extend(flash.display.Sprite.prototype.__properties__,{get_currentFrame:"get_currentFrame",get_framesLoaded:"get_framesLoaded",get_totalFrames:"get_totalFrames"}) -}); -flash.display.PixelSnapping = $hxClasses["flash.display.PixelSnapping"] = { __ename__ : true, __constructs__ : ["NEVER","AUTO","ALWAYS"] } -flash.display.PixelSnapping.NEVER = ["NEVER",0]; -flash.display.PixelSnapping.NEVER.toString = $estr; -flash.display.PixelSnapping.NEVER.__enum__ = flash.display.PixelSnapping; -flash.display.PixelSnapping.AUTO = ["AUTO",1]; -flash.display.PixelSnapping.AUTO.toString = $estr; -flash.display.PixelSnapping.AUTO.__enum__ = flash.display.PixelSnapping; -flash.display.PixelSnapping.ALWAYS = ["ALWAYS",2]; -flash.display.PixelSnapping.ALWAYS.toString = $estr; -flash.display.PixelSnapping.ALWAYS.__enum__ = flash.display.PixelSnapping; -flash.display.Shape = function() { + return -1; +} +flash._Vector.Vector_Impl_.ofArray = function(a) { + return flash._Vector.Vector_Impl_.concat(flash._Vector.Vector_Impl_._new(),a); +} +flash._Vector.Vector_Impl_.convert = function(v) { + return v; +} +flash._Vector.Vector_Impl_.fromArray = function(a) { + return a; +} +flash._Vector.Vector_Impl_.toArray = function(this1) { + return this1; +} +flash._Vector.Vector_Impl_.get_length = function(this1) { + return this1.length; +} +flash._Vector.Vector_Impl_.set_length = function(this1,value) { + if(value < this1.length) this1 = this1.slice(0,value); + while(value > this1.length) this1.push(null); + return value; +} +flash._Vector.Vector_Impl_.get_fixed = function(this1) { + return false; +} +flash._Vector.Vector_Impl_.set_fixed = function(this1,value) { + return value; +} +flash.accessibility = {} +flash.accessibility.AccessibilityProperties = function() { + this.description = ""; + this.forceSimple = false; + this.name = ""; + this.noAutoLabeling = false; + this.shortcut = ""; + this.silent = false; +}; +$hxClasses["flash.accessibility.AccessibilityProperties"] = flash.accessibility.AccessibilityProperties; +flash.accessibility.AccessibilityProperties.__name__ = ["flash","accessibility","AccessibilityProperties"]; +flash.accessibility.AccessibilityProperties.prototype = { + __class__: flash.accessibility.AccessibilityProperties +} +flash.display.Bitmap = function(inBitmapData,inPixelSnapping,inSmoothing) { + if(inSmoothing == null) inSmoothing = false; flash.display.DisplayObject.call(this); - this.__graphics = new flash.display.Graphics(); + this.pixelSnapping = inPixelSnapping; + this.smoothing = inSmoothing; + if(inBitmapData != null) { + this.set_bitmapData(inBitmapData); + if(this.bitmapData.__referenceCount == 1) this.__graphics = new flash.display.Graphics(this.bitmapData.___textureBuffer); + } + if(this.pixelSnapping == null) this.pixelSnapping = flash.display.PixelSnapping.AUTO; + if(this.__graphics == null) this.__graphics = new flash.display.Graphics(); + if(this.bitmapData != null) this.__render(); }; -$hxClasses["flash.display.Shape"] = flash.display.Shape; -flash.display.Shape.__name__ = ["flash","display","Shape"]; -flash.display.Shape.__super__ = flash.display.DisplayObject; -flash.display.Shape.prototype = $extend(flash.display.DisplayObject.prototype,{ - get_graphics: function() { - return this.__graphics; +$hxClasses["flash.display.Bitmap"] = flash.display.Bitmap; +flash.display.Bitmap.__name__ = ["flash","display","Bitmap"]; +flash.display.Bitmap.__super__ = flash.display.DisplayObject; +flash.display.Bitmap.prototype = $extend(flash.display.DisplayObject.prototype,{ + set_bitmapData: function(inBitmapData) { + if(inBitmapData != this.bitmapData) { + if(this.bitmapData != null) { + this.bitmapData.__referenceCount--; + if(this.__graphics.__surface == this.bitmapData.___textureBuffer) flash.Lib.__setSurfaceOpacity(this.bitmapData.___textureBuffer,0); + } + if(inBitmapData != null) inBitmapData.__referenceCount++; + } + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + this.bitmapData = inBitmapData; + return inBitmapData; + } + ,__render: function(inMask,clipRect) { + if(!this.__combinedVisible) return; + if(this.bitmapData == null) return; + if((this.___renderFlags & 4) != 0 || (this.___renderFlags & 8) != 0) this.__validateMatrix(); + if(this.bitmapData.___textureBuffer != this.__graphics.__surface) { + var imageDataLease = this.bitmapData.__lease; + if(imageDataLease != null && (this.__currentLease == null || imageDataLease.seed != this.__currentLease.seed || imageDataLease.time != this.__currentLease.time)) { + var srcCanvas = this.bitmapData.___textureBuffer; + this.__graphics.__surface.width = srcCanvas.width; + this.__graphics.__surface.height = srcCanvas.height; + this.__graphics.clear(); + flash.Lib.__drawToSurface(srcCanvas,this.__graphics.__surface); + this.__currentLease = imageDataLease.clone(); + this.___renderFlags |= 64; + if(this.parent != null) this.parent.___renderFlags |= 64; + this.__applyFilters(this.__graphics.__surface); + this.___renderFlags |= 32; + } + } + if(inMask != null) { + this.__applyFilters(this.__graphics.__surface); + var m = this.getBitmapSurfaceTransform(this.__graphics); + flash.Lib.__drawToSurface(this.__graphics.__surface,inMask,m,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha,clipRect,this.smoothing); + } else { + if((this.___renderFlags & 32) != 0) { + var m = this.getBitmapSurfaceTransform(this.__graphics); + flash.Lib.__setSurfaceTransform(this.__graphics.__surface,m); + this.___renderFlags &= -33; + } + if(!this.__init) { + flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,0); + this.__init = true; + } else flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha); + } } ,__getObjectUnderPoint: function(point) { - if(this.parent == null) return null; - if(this.parent.mouseEnabled && flash.display.DisplayObject.prototype.__getObjectUnderPoint.call(this,point) == this) return this.parent; else return null; + if(!this.get_visible()) return null; else if(this.bitmapData != null) { + var local = this.globalToLocal(point); + if(local.x < 0 || local.y < 0 || local.x > this.get_width() / this.get_scaleX() || local.y > this.get_height() / this.get_scaleY()) return null; else return this; + } else return flash.display.DisplayObject.prototype.__getObjectUnderPoint.call(this,point); } ,__getGraphics: function() { return this.__graphics; } - ,toString: function() { - return "[Shape name=" + this.name + " id=" + this.___id + "]"; - } - ,__class__: flash.display.Shape - ,__properties__: $extend(flash.display.DisplayObject.prototype.__properties__,{get_graphics:"get_graphics"}) -}); -flash.display.SpreadMethod = $hxClasses["flash.display.SpreadMethod"] = { __ename__ : true, __constructs__ : ["REPEAT","REFLECT","PAD"] } -flash.display.SpreadMethod.REPEAT = ["REPEAT",0]; -flash.display.SpreadMethod.REPEAT.toString = $estr; -flash.display.SpreadMethod.REPEAT.__enum__ = flash.display.SpreadMethod; -flash.display.SpreadMethod.REFLECT = ["REFLECT",1]; -flash.display.SpreadMethod.REFLECT.toString = $estr; -flash.display.SpreadMethod.REFLECT.__enum__ = flash.display.SpreadMethod; -flash.display.SpreadMethod.PAD = ["PAD",2]; -flash.display.SpreadMethod.PAD.toString = $estr; -flash.display.SpreadMethod.PAD.__enum__ = flash.display.SpreadMethod; -flash.events.Event = function(inType,inBubbles,inCancelable) { - if(inCancelable == null) inCancelable = false; - if(inBubbles == null) inBubbles = false; - this.type = inType; - this.bubbles = inBubbles; - this.cancelable = inCancelable; - this.__isCancelled = false; - this.__isCancelledNow = false; - this.target = null; - this.currentTarget = null; - this.eventPhase = flash.events.EventPhase.AT_TARGET; -}; -$hxClasses["flash.events.Event"] = flash.events.Event; -flash.events.Event.__name__ = ["flash","events","Event"]; -flash.events.Event.prototype = { - __setPhase: function(phase) { - this.eventPhase = phase; - } - ,__getIsCancelledNow: function() { - return this.__isCancelledNow; - } - ,__getIsCancelled: function() { - return this.__isCancelled; - } - ,__createSimilar: function(type,related,targ) { - var result = new flash.events.Event(type,this.bubbles,this.cancelable); - if(targ != null) result.target = targ; - return result; + ,validateBounds: function() { + if(this.get__boundsInvalid()) { + flash.display.DisplayObject.prototype.validateBounds.call(this); + if(this.bitmapData != null) { + var r = new flash.geom.Rectangle(0,0,this.bitmapData.get_width(),this.bitmapData.get_height()); + if(r.width != 0 || r.height != 0) { + if(this.__boundsRect.width == 0 && this.__boundsRect.height == 0) this.__boundsRect = r.clone(); else this.__boundsRect.extendBounds(r); + } + } + if(this.scale9Grid != null) { + this.__boundsRect.width *= this.__scaleX; + this.__boundsRect.height *= this.__scaleY; + this.__width = this.__boundsRect.width; + this.__height = this.__boundsRect.height; + } else { + this.__width = this.__boundsRect.width * this.__scaleX; + this.__height = this.__boundsRect.height * this.__scaleY; + } + } } ,toString: function() { - return "[Event type=" + this.type + " bubbles=" + Std.string(this.bubbles) + " cancelable=" + Std.string(this.cancelable) + "]"; + return "[Bitmap name=" + this.name + " id=" + this.___id + "]"; } - ,stopPropagation: function() { - this.__isCancelled = true; + ,getBitmapSurfaceTransform: function(gfx) { + var extent = gfx.__extentWithFilters; + var fm = this.transform.__getFullMatrix(null); + fm.__translateTransformed(extent.get_topLeft()); + return fm; } - ,stopImmediatePropagation: function() { - this.__isCancelled = true; - this.__isCancelledNow = true; + ,__class__: flash.display.Bitmap + ,__properties__: $extend(flash.display.DisplayObject.prototype.__properties__,{set_bitmapData:"set_bitmapData"}) +}); +flash.display.BitmapData = function(width,height,transparent,inFillColor) { + if(inFillColor == null) inFillColor = -1; + if(transparent == null) transparent = true; + this.__locked = false; + this.__referenceCount = 0; + this.__leaseNum = 0; + this.__lease = new flash.display.ImageDataLease(); + this.__lease.set(this.__leaseNum++,new Date().getTime()); + this.___textureBuffer = js.Browser.document.createElement("canvas"); + this.___textureBuffer.width = width; + this.___textureBuffer.height = height; + this.___id = flash.utils.Uuid.uuid(); + flash.Lib.__setSurfaceId(this.___textureBuffer,this.___id); + this.__transparent = transparent; + this.rect = new flash.geom.Rectangle(0,0,width,height); + if(this.__transparent) { + this.__transparentFiller = js.Browser.document.createElement("canvas"); + this.__transparentFiller.width = width; + this.__transparentFiller.height = height; + var ctx = this.__transparentFiller.getContext("2d"); + ctx.fillStyle = "rgba(0,0,0,0);"; + ctx.fill(); } - ,clone: function() { - return new flash.events.Event(this.type,this.bubbles,this.cancelable); + if(inFillColor != null && width > 0 && height > 0) { + if(!this.__transparent) inFillColor |= -16777216; + this.__initColor = inFillColor; + this.__fillRect(this.rect,inFillColor); } - ,__class__: flash.events.Event -} -flash.events.MouseEvent = function(type,bubbles,cancelable,localX,localY,relatedObject,ctrlKey,altKey,shiftKey,buttonDown,delta,commandKey,clickCount) { - if(clickCount == null) clickCount = 0; - if(commandKey == null) commandKey = false; - if(delta == null) delta = 0; - if(buttonDown == null) buttonDown = false; - if(shiftKey == null) shiftKey = false; - if(altKey == null) altKey = false; - if(ctrlKey == null) ctrlKey = false; - if(localY == null) localY = 0; - if(localX == null) localX = 0; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = true; - flash.events.Event.call(this,type,bubbles,cancelable); - this.shiftKey = shiftKey; - this.altKey = altKey; - this.ctrlKey = ctrlKey; - this.bubbles = bubbles; - this.relatedObject = relatedObject; - this.delta = delta; - this.localX = localX; - this.localY = localY; - this.buttonDown = buttonDown; - this.commandKey = commandKey; - this.clickCount = clickCount; }; -$hxClasses["flash.events.MouseEvent"] = flash.events.MouseEvent; -flash.events.MouseEvent.__name__ = ["flash","events","MouseEvent"]; -flash.events.MouseEvent.__create = function(type,event,local,target) { - var __mouseDown = false; - var delta = 2; - if(type == flash.events.MouseEvent.MOUSE_WHEEL) { - var mouseEvent = event; - if(mouseEvent.wheelDelta) delta = mouseEvent.wheelDelta / 120 | 0; else if(mouseEvent.detail) -mouseEvent.detail | 0; - } - if(type == flash.events.MouseEvent.MOUSE_DOWN) __mouseDown = event.which != null?event.which == 1:event.button != null?event.button == 0:false; else if(type == flash.events.MouseEvent.MOUSE_UP) { - if(event.which != null) { - if(event.which == 1) __mouseDown = false; else if(event.button != null) { - if(event.button == 0) __mouseDown = false; else __mouseDown = false; - } - } +$hxClasses["flash.display.BitmapData"] = flash.display.BitmapData; +flash.display.BitmapData.__name__ = ["flash","display","BitmapData"]; +flash.display.BitmapData.__interfaces__ = [flash.display.IBitmapDrawable]; +flash.display.BitmapData.getRGBAPixels = function(bitmapData) { + var p = bitmapData.getPixels(new flash.geom.Rectangle(0,0,bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0,bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0)); + var num = (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.width:0) * (bitmapData.___textureBuffer != null?bitmapData.___textureBuffer.height:0); + p.position = 0; + var _g = 0; + while(_g < num) { + var i = _g++; + var pos = p.position; + var alpha = p.readByte(); + var red = p.readByte(); + var green = p.readByte(); + var blue = p.readByte(); + p.position = pos; + p.writeByte(red); + p.writeByte(green); + p.writeByte(blue); + p.writeByte(alpha); } - var pseudoEvent = new flash.events.MouseEvent(type,true,false,local.x,local.y,null,event.ctrlKey,event.altKey,event.shiftKey,__mouseDown,delta); - pseudoEvent.stageX = flash.Lib.get_current().get_stage().get_mouseX(); - pseudoEvent.stageY = flash.Lib.get_current().get_stage().get_mouseY(); - pseudoEvent.target = target; - return pseudoEvent; + return p; } -flash.events.MouseEvent.__super__ = flash.events.Event; -flash.events.MouseEvent.prototype = $extend(flash.events.Event.prototype,{ - updateAfterEvent: function() { - } - ,__createSimilar: function(type,related,targ) { - var result = new flash.events.MouseEvent(type,this.bubbles,this.cancelable,this.localX,this.localY,related == null?this.relatedObject:related,this.ctrlKey,this.altKey,this.shiftKey,this.buttonDown,this.delta,this.commandKey,this.clickCount); - if(targ != null) result.target = targ; - return result; - } - ,__class__: flash.events.MouseEvent -}); -flash.display.Stage = function(width,height) { - flash.display.DisplayObjectContainer.call(this); - this.__focusObject = null; - this.__focusObjectActivated = false; - this.__windowWidth = width; - this.__windowHeight = height; - this.stageFocusRect = false; - this.scaleMode = flash.display.StageScaleMode.SHOW_ALL; - this.__stageMatrix = new flash.geom.Matrix(); - this.tabEnabled = true; - this.set_frameRate(0.0); - this.set_backgroundColor(16777215); - this.name = "Stage"; - this.loaderInfo = flash.display.LoaderInfo.create(null); - this.loaderInfo.parameters.width = Std.string(this.__windowWidth); - this.loaderInfo.parameters.height = Std.string(this.__windowHeight); - this.__pointInPathMode = flash.display.Graphics.__detectIsPointInPathMode(); - this.__mouseOverObjects = []; - this.set_showDefaultContextMenu(true); - this.__touchInfo = []; - this.__uIEventsQueue = new Array(1000); - this.__uIEventsQueueIndex = 0; -}; -$hxClasses["flash.display.Stage"] = flash.display.Stage; -flash.display.Stage.__name__ = ["flash","display","Stage"]; -flash.display.Stage.getOrientation = function() { - var rotation = window.orientation; - var orientation = flash.display.Stage.OrientationPortrait; - switch(rotation) { - case -90: - orientation = flash.display.Stage.OrientationLandscapeLeft; - break; - case 180: - orientation = flash.display.Stage.OrientationPortraitUpsideDown; - break; - case 90: - orientation = flash.display.Stage.OrientationLandscapeRight; - break; - default: - orientation = flash.display.Stage.OrientationPortrait; +flash.display.BitmapData.loadFromBase64 = function(base64,type,onload) { + var bitmapData = new flash.display.BitmapData(0,0); + bitmapData.__loadFromBase64(base64,type,onload); + return bitmapData; +} +flash.display.BitmapData.loadFromBytes = function(bytes,inRawAlpha,onload) { + var bitmapData = new flash.display.BitmapData(0,0); + bitmapData.__loadFromBytes(bytes,inRawAlpha,onload); + return bitmapData; +} +flash.display.BitmapData.__base64Encode = function(bytes) { + var blob = ""; + var codex = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + bytes.position = 0; + while(bytes.position < bytes.length) { + var by1 = 0, by2 = 0, by3 = 0; + by1 = bytes.readByte(); + if(bytes.position < bytes.length) by2 = bytes.readByte(); + if(bytes.position < bytes.length) by3 = bytes.readByte(); + var by4 = 0, by5 = 0, by6 = 0, by7 = 0; + by4 = by1 >> 2; + by5 = (by1 & 3) << 4 | by2 >> 4; + by6 = (by2 & 15) << 2 | by3 >> 6; + by7 = by3 & 63; + blob += codex.charAt(by4); + blob += codex.charAt(by5); + if(bytes.position < bytes.length) blob += codex.charAt(by6); else blob += "="; + if(bytes.position < bytes.length) blob += codex.charAt(by7); else blob += "="; } - return orientation; + return blob; } -flash.display.Stage.__super__ = flash.display.DisplayObjectContainer; -flash.display.Stage.prototype = $extend(flash.display.DisplayObjectContainer.prototype,{ - get_stageWidth: function() { - return this.__windowWidth; +flash.display.BitmapData.__createFromHandle = function(inHandle) { + var result = new flash.display.BitmapData(0,0); + result.___textureBuffer = inHandle; + return result; +} +flash.display.BitmapData.__isJPG = function(bytes) { + bytes.position = 0; + return bytes.readByte() == 255 && bytes.readByte() == 216; +} +flash.display.BitmapData.__isPNG = function(bytes) { + bytes.position = 0; + return bytes.readByte() == 137 && bytes.readByte() == 80 && bytes.readByte() == 78 && bytes.readByte() == 71 && bytes.readByte() == 13 && bytes.readByte() == 10 && bytes.readByte() == 26 && bytes.readByte() == 10; +} +flash.display.BitmapData.prototype = { + get_width: function() { + if(this.___textureBuffer != null) return this.___textureBuffer.width; else return 0; } - ,get_stageHeight: function() { - return this.__windowHeight; + ,get_transparent: function() { + return this.__transparent; } - ,get_stage: function() { - return flash.Lib.__getStage(); + ,get_height: function() { + if(this.___textureBuffer != null) return this.___textureBuffer.height; else return 0; } - ,set_showDefaultContextMenu: function(showDefaultContextMenu) { - if(showDefaultContextMenu != this.__showDefaultContextMenu && this.__showDefaultContextMenu != null) { - if(!showDefaultContextMenu) flash.Lib.__disableRightClick(); else flash.Lib.__enableRightClick(); + ,__onLoad: function(data,e) { + var canvas = data.texture; + var width = data.image.width; + var height = data.image.height; + canvas.width = width; + canvas.height = height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(data.image,0,0,width,height); + data.bitmapData.width = width; + data.bitmapData.height = height; + data.bitmapData.rect = new flash.geom.Rectangle(0,0,width,height); + data.bitmapData.__buildLease(); + if(data.inLoader != null) { + var e1 = new flash.events.Event(flash.events.Event.COMPLETE); + e1.target = data.inLoader; + data.inLoader.dispatchEvent(e1); } - this.__showDefaultContextMenu = showDefaultContextMenu; - return showDefaultContextMenu; - } - ,get_showDefaultContextMenu: function() { - return this.__showDefaultContextMenu; - } - ,set_quality: function(inQuality) { - return this.quality = inQuality; - } - ,get_quality: function() { - return this.quality != null?this.quality:flash.display.StageQuality.BEST; - } - ,get_mouseY: function() { - return this._mouseY; - } - ,get_mouseX: function() { - return this._mouseX; } - ,get_fullScreenHeight: function() { - return js.Browser.window.innerHeight; - } - ,get_fullScreenWidth: function() { - return js.Browser.window.innerWidth; - } - ,set_frameRate: function(speed) { - if(speed == 0) { - var window = js.Browser.window; - var __requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame; - if(__requestAnimationFrame == null) speed = 60; + ,__loadFromFile: function(inFilename,inLoader) { + var _g = this; + var image = js.Browser.document.createElement("img"); + if(inLoader != null) { + var data = { image : image, texture : this.___textureBuffer, inLoader : inLoader, bitmapData : this}; + image.addEventListener("load",(function(f,a1) { + return function(e) { + return f(a1,e); + }; + })($bind(this,this.__onLoad),data),false); + image.addEventListener("error",function(e) { + if(!image.complete) _g.__onLoad(data,e); + },false); + } + image.src = inFilename; + if(image.complete) { } - if(speed != 0) this.__interval = 1000.0 / speed | 0; - this.__frameRate = speed; - this.__updateNextWake(); - return speed; - } - ,get_frameRate: function() { - return this.__frameRate; } - ,set_focus: function(inObj) { - this.__onFocus(inObj); - return this.__focusObject; + ,__incrNumRefBitmaps: function() { + this.__assignedBitmaps++; } - ,get_focus: function() { - return this.__focusObject; + ,__getNumRefBitmaps: function() { + return this.__assignedBitmaps; } - ,set_displayState: function(displayState) { - if(displayState != this.displayState && this.displayState != null) { - switch( (displayState)[1] ) { - case 0: - flash.Lib.__disableFullScreen(); - break; - case 1: - case 2: - flash.Lib.__enableFullScreen(); - break; + ,__loadFromBytes: function(bytes,inRawAlpha,onload) { + var _g = this; + var type = ""; + if(flash.display.BitmapData.__isPNG(bytes)) type = "image/png"; else if(flash.display.BitmapData.__isJPG(bytes)) type = "image/jpeg"; else throw new flash.errors.IOError("BitmapData tried to read a PNG/JPG ByteArray, but found an invalid header."); + if(inRawAlpha != null) this.__loadFromBase64(flash.display.BitmapData.__base64Encode(bytes),type,function(_) { + var ctx = _g.___textureBuffer.getContext("2d"); + var pixels = ctx.getImageData(0,0,_g.___textureBuffer.width,_g.___textureBuffer.height); + var _g2 = 0, _g1 = inRawAlpha.length; + while(_g2 < _g1) { + var i = _g2++; + pixels.data[i * 4 + 3] = inRawAlpha.readUnsignedByte(); } - } - this.displayState = displayState; - return displayState; + ctx.putImageData(pixels,0,0); + if(onload != null) onload(_g); + }); else this.__loadFromBase64(flash.display.BitmapData.__base64Encode(bytes),type,onload); } - ,get_displayState: function() { - return this.displayState; + ,__loadFromBase64: function(base64,type,onload) { + var _g = this; + var img = js.Browser.document.createElement("img"); + var canvas = this.___textureBuffer; + var drawImage = function(_) { + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img,0,0); + _g.rect = new flash.geom.Rectangle(0,0,canvas.width,canvas.height); + if(onload != null) onload(_g); + }; + img.addEventListener("load",drawImage,false); + img.src = "data:" + type + ";base64," + base64; } - ,set_color: function(col) { - return this.__backgroundColour = col; + ,__getLease: function() { + return this.__lease; } - ,get_color: function() { - return this.__backgroundColour; + ,__fillRect: function(rect,color) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var r = (color & 16711680) >>> 16; + var g = (color & 65280) >>> 8; + var b = color & 255; + var a = this.__transparent?color >>> 24:255; + if(!this.__locked) { + var style = "rgba(" + r + ", " + g + ", " + b + ", " + a / 255 + ")"; + ctx.fillStyle = style; + ctx.fillRect(rect.x,rect.y,rect.width,rect.height); + } else { + var s = 4 * (Math.round(rect.x) + Math.round(rect.y) * this.__imageData.width); + var offsetY; + var offsetX; + var _g1 = 0, _g = Math.round(rect.height); + while(_g1 < _g) { + var i = _g1++; + offsetY = i * this.__imageData.width; + var _g3 = 0, _g2 = Math.round(rect.width); + while(_g3 < _g2) { + var j = _g3++; + offsetX = 4 * (j + offsetY); + this.__imageData.data[s + offsetX] = r; + this.__imageData.data[s + offsetX + 1] = g; + this.__imageData.data[s + offsetX + 2] = b; + this.__imageData.data[s + offsetX + 3] = a; + } + } + this.__imageDataChanged = true; + } } - ,set_backgroundColor: function(col) { - return this.__backgroundColour = col; + ,__decrNumRefBitmaps: function() { + this.__assignedBitmaps--; } - ,get_backgroundColor: function() { - return this.__backgroundColour; + ,__clearCanvas: function() { + var ctx = this.___textureBuffer.getContext("2d"); + ctx.clearRect(0,0,this.___textureBuffer.width,this.___textureBuffer.height); } - ,__onTouch: function(event,touch,type,touchInfo,isPrimaryTouchPoint) { - var rect = flash.Lib.mMe.__scr.getBoundingClientRect(); - var point = new flash.geom.Point(touch.pageX - rect.left,touch.pageY - rect.top); - var obj = this.__getObjectUnderPoint(point); - this._mouseX = point.x; - this._mouseY = point.y; - var stack = new Array(); - if(obj != null) obj.__getInteractiveObjectStack(stack); - if(stack.length > 0) { - stack.reverse(); - var local = obj.globalToLocal(point); - var evt = flash.events.TouchEvent.__create(type,event,touch,local,obj); - evt.touchPointID = touch.identifier; - evt.isPrimaryTouchPoint = isPrimaryTouchPoint; - this.__checkInOuts(evt,stack,touchInfo); - obj.__fireEvent(evt); - var mouseType = (function($this) { - var $r; - switch(type) { - case "touchBegin": - $r = flash.events.MouseEvent.MOUSE_DOWN; - break; - case "touchEnd": - $r = flash.events.MouseEvent.MOUSE_UP; - break; - default: - $r = (function($this) { - var $r; - if($this.__dragObject != null) $this.__drag(point); - $r = flash.events.MouseEvent.MOUSE_MOVE; - return $r; - }($this)); - } - return $r; - }(this)); - obj.__fireEvent(flash.events.MouseEvent.__create(mouseType,evt,local,obj)); - } else { - var evt = flash.events.TouchEvent.__create(type,event,touch,point,null); - evt.touchPointID = touch.identifier; - evt.isPrimaryTouchPoint = isPrimaryTouchPoint; - this.__checkInOuts(evt,stack,touchInfo); + ,__buildLease: function() { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + } + ,unlock: function(changeRect) { + this.__locked = false; + var ctx = this.___textureBuffer.getContext("2d"); + if(this.__imageDataChanged) { + if(changeRect != null) ctx.putImageData(this.__imageData,0,0,changeRect.x,changeRect.y,changeRect.width,changeRect.height); else ctx.putImageData(this.__imageData,0,0); + } + var _g = 0, _g1 = this.__copyPixelList; + while(_g < _g1.length) { + var copyCache = _g1[_g]; + ++_g; + if(this.__transparent && copyCache.transparentFiller != null) { + var trpCtx = copyCache.transparentFiller.getContext("2d"); + var trpData = trpCtx.getImageData(copyCache.sourceX,copyCache.sourceY,copyCache.sourceWidth,copyCache.sourceHeight); + ctx.putImageData(trpData,copyCache.destX,copyCache.destY); + } + ctx.drawImage(copyCache.handle,copyCache.sourceX,copyCache.sourceY,copyCache.sourceWidth,copyCache.sourceHeight,copyCache.destX,copyCache.destY,copyCache.sourceWidth,copyCache.sourceHeight); } + this.__lease.set(this.__leaseNum++,new Date().getTime()); } - ,__onResize: function(inW,inH) { - this.__windowWidth = inW; - this.__windowHeight = inH; - var event = new flash.events.Event(flash.events.Event.RESIZE); - event.target = this; - this.__broadcast(event); + ,threshold: function(sourceBitmapData,sourceRect,destPoint,operation,threshold,color,mask,copySource) { + if(copySource == null) copySource = false; + if(mask == null) mask = -1; + if(color == null) color = 0; + console.log("BitmapData.threshold not implemented"); + return 0; } - ,__onMouse: function(event,type) { - var rect = flash.Lib.mMe.__scr.getBoundingClientRect(); - var point = new flash.geom.Point(event.clientX - rect.left,event.clientY - rect.top); - if(this.__dragObject != null) this.__drag(point); - var obj = this.__getObjectUnderPoint(point); - this._mouseX = point.x; - this._mouseY = point.y; - var stack = new Array(); - if(obj != null) obj.__getInteractiveObjectStack(stack); - if(stack.length > 0) { - stack.reverse(); - var local = obj.globalToLocal(point); - var evt = flash.events.MouseEvent.__create(type,event,local,obj); - this.__checkInOuts(evt,stack); - if(type == flash.events.MouseEvent.MOUSE_DOWN) this.__onFocus(stack[stack.length - 1]); - obj.__fireEvent(evt); + ,setPixels: function(rect,byteArray) { + rect = this.clipRect(rect); + if(rect == null) return; + var len = Math.round(4 * rect.width * rect.height); + if(!this.__locked) { + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.createImageData(rect.width,rect.height); + var _g = 0; + while(_g < len) { + var i = _g++; + imageData.data[i] = byteArray.readByte(); + } + ctx.putImageData(imageData,rect.x,rect.y); } else { - var evt = flash.events.MouseEvent.__create(type,event,point,null); - this.__checkInOuts(evt,stack); - } - } - ,__onFocus: function(target) { - if(target != this.__focusObject) { - if(this.__focusObject != null) this.__focusObject.__fireEvent(new flash.events.FocusEvent(flash.events.FocusEvent.FOCUS_OUT,true,false,this.__focusObject,false,0)); - target.__fireEvent(new flash.events.FocusEvent(flash.events.FocusEvent.FOCUS_IN,true,false,target,false,0)); - this.__focusObject = target; + var offset = Math.round(4 * this.__imageData.width * rect.y + rect.x * 4); + var pos = offset; + var boundR = Math.round(4 * (rect.x + rect.width)); + var _g = 0; + while(_g < len) { + var i = _g++; + if(pos % (this.__imageData.width * 4) > boundR - 1) pos += this.__imageData.width * 4 - boundR; + this.__imageData.data[pos] = byteArray.readByte(); + pos++; + } + this.__imageDataChanged = true; } } - ,__onKey: function(code,pressed,inChar,ctrl,alt,shift,keyLocation) { - var stack = new Array(); - if(this.__focusObject == null) this.__getInteractiveObjectStack(stack); else this.__focusObject.__getInteractiveObjectStack(stack); - if(stack.length > 0) { - var obj = stack[0]; - var evt = new flash.events.KeyboardEvent(pressed?flash.events.KeyboardEvent.KEY_DOWN:flash.events.KeyboardEvent.KEY_UP,true,false,inChar,code,keyLocation,ctrl,alt,shift); - obj.__fireEvent(evt); + ,setPixel32: function(x,y,color) { + if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return; + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.createImageData(1,1); + imageData.data[0] = (color & 16711680) >>> 16; + imageData.data[1] = (color & 65280) >>> 8; + imageData.data[2] = color & 255; + if(this.__transparent) imageData.data[3] = (color & -16777216) >>> 24; else imageData.data[3] = 255; + ctx.putImageData(imageData,x,y); + } else { + var offset = 4 * y * this.__imageData.width + x * 4; + this.__imageData.data[offset] = (color & 16711680) >>> 16; + this.__imageData.data[offset + 1] = (color & 65280) >>> 8; + this.__imageData.data[offset + 2] = color & 255; + if(this.__transparent) this.__imageData.data[offset + 3] = (color & -16777216) >>> 24; else this.__imageData.data[offset + 3] = 255; + this.__imageDataChanged = true; } } - ,__handleOrientationChange: function() { - } - ,__handleAccelerometer: function(evt) { - flash.display.Stage.__acceleration.x = evt.accelerationIncludingGravity.x; - flash.display.Stage.__acceleration.y = evt.accelerationIncludingGravity.y; - flash.display.Stage.__acceleration.z = evt.accelerationIncludingGravity.z; - } - ,__updateNextWake: function() { - if(this.__frameRate == 0) { - var __requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame; - __requestAnimationFrame($bind(this,this.__updateNextWake)); - this.__stageRender(); + ,setPixel: function(x,y,color) { + if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return; + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.createImageData(1,1); + imageData.data[0] = (color & 16711680) >>> 16; + imageData.data[1] = (color & 65280) >>> 8; + imageData.data[2] = color & 255; + if(this.__transparent) imageData.data[3] = 255; + ctx.putImageData(imageData,x,y); } else { - js.Browser.window.clearInterval(this.__timer); - this.__timer = js.Browser.window.setInterval($bind(this,this.__stageRender),this.__interval); + var offset = 4 * y * this.__imageData.width + x * 4; + this.__imageData.data[offset] = (color & 16711680) >>> 16; + this.__imageData.data[offset + 1] = (color & 65280) >>> 8; + this.__imageData.data[offset + 2] = color & 255; + if(this.__transparent) this.__imageData.data[offset + 3] = 255; + this.__imageDataChanged = true; } } - ,__stopDrag: function(sprite) { - this.__dragBounds = null; - this.__dragObject = null; + ,scroll: function(x,y) { + throw "bitmapData.scroll is currently not supported for HTML5"; } - ,__startDrag: function(sprite,lockCenter,bounds) { - if(lockCenter == null) lockCenter = false; - this.__dragBounds = bounds == null?null:bounds.clone(); - this.__dragObject = sprite; - if(this.__dragObject != null) { - var mouse = new flash.geom.Point(this._mouseX,this._mouseY); - var p = this.__dragObject.parent; - if(p != null) mouse = p.globalToLocal(mouse); - if(lockCenter) { - var bounds1 = sprite.getBounds(this); - this.__dragOffsetX = this.__dragObject.get_x() - (bounds1.width / 2 + bounds1.x); - this.__dragOffsetY = this.__dragObject.get_y() - (bounds1.height / 2 + bounds1.y); - } else { - this.__dragOffsetX = this.__dragObject.get_x() - mouse.x; - this.__dragOffsetY = this.__dragObject.get_y() - mouse.y; - } - } - } - ,__stageRender: function(_) { - if(!this.__stageActive) { - this.__onResize(this.__windowWidth,this.__windowHeight); - var event = new flash.events.Event(flash.events.Event.ACTIVATE); - event.target = this; - this.__broadcast(event); - this.__stageActive = true; - } - var _g1 = 0, _g = this.__uIEventsQueueIndex; + ,noise: function(randomSeed,low,high,channelOptions,grayScale) { + if(grayScale == null) grayScale = false; + if(channelOptions == null) channelOptions = 7; + if(high == null) high = 255; + if(low == null) low = 0; + var generator = new flash.display._BitmapData.MinstdGenerator(randomSeed); + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = null; + if(this.__locked) imageData = this.__imageData; else imageData = ctx.createImageData(this.___textureBuffer.width,this.___textureBuffer.height); + var _g1 = 0, _g = this.___textureBuffer.width * this.___textureBuffer.height; while(_g1 < _g) { var i = _g1++; - if(this.__uIEventsQueue[i] != null) this.__processStageEvent(this.__uIEventsQueue[i]); - } - this.__uIEventsQueueIndex = 0; - var event = new flash.events.Event(flash.events.Event.ENTER_FRAME); - this.__broadcast(event); - if(this.__invalid) { - var event1 = new flash.events.Event(flash.events.Event.RENDER); - this.__broadcast(event1); + if(grayScale) imageData.data[i * 4] = imageData.data[i * 4 + 1] = imageData.data[i * 4 + 2] = low + generator.nextValue() % (high - low + 1); else { + imageData.data[i * 4] = (channelOptions & 1) == 0?0:low + generator.nextValue() % (high - low + 1); + imageData.data[i * 4 + 1] = (channelOptions & 2) == 0?0:low + generator.nextValue() % (high - low + 1); + imageData.data[i * 4 + 2] = (channelOptions & 4) == 0?0:low + generator.nextValue() % (high - low + 1); + } + imageData.data[i * 4 + 3] = (channelOptions & 8) == 0?255:low + generator.nextValue() % (high - low + 1); } - this.__renderAll(); + if(this.__locked) this.__imageDataChanged = true; else ctx.putImageData(imageData,0,0); } - ,__renderToCanvas: function(canvas) { - canvas.width = canvas.width; - this.__render(canvas); + ,lock: function() { + this.__locked = true; + var ctx = this.___textureBuffer.getContext("2d"); + this.__imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); + this.__imageDataChanged = false; + this.__copyPixelList = []; } - ,__renderAll: function() { - this.__render(null,null); + ,hitTest: function(firstPoint,firstAlphaThreshold,secondObject,secondBitmapDataPoint,secondAlphaThreshold) { + if(secondAlphaThreshold == null) secondAlphaThreshold = 1; + var type = Type.getClassName(Type.getClass(secondObject)); + firstAlphaThreshold = firstAlphaThreshold & -1; + var me = this; + var doHitTest = function(imageData) { + if(secondObject.__proto__ == null || secondObject.__proto__.__class__ == null || secondObject.__proto__.__class__.__name__ == null) return false; + var _g = secondObject.__proto__.__class__.__name__[2]; + switch(_g) { + case "Rectangle": + var rect = secondObject; + rect.x -= firstPoint.x; + rect.y -= firstPoint.y; + rect = me.clipRect(me.rect); + if(me.rect == null) return false; + var boundingBox = new flash.geom.Rectangle(0,0,me.___textureBuffer != null?me.___textureBuffer.width:0,me.___textureBuffer != null?me.___textureBuffer.height:0); + if(!rect.intersects(boundingBox)) return false; + var diff = rect.intersection(boundingBox); + var offset = 4 * (Math.round(diff.x) + Math.round(diff.y) * imageData.width) + 3; + var pos = offset; + var boundR = Math.round(4 * (diff.x + diff.width)); + while(pos < offset + Math.round(4 * (diff.width + imageData.width * diff.height))) { + if(pos % (imageData.width * 4) > boundR - 1) pos += imageData.width * 4 - boundR; + if(imageData.data[pos] - firstAlphaThreshold >= 0) return true; + pos += 4; + } + return false; + case "Point": + var point = secondObject; + var x = point.x - firstPoint.x; + var y = point.y - firstPoint.y; + if(x < 0 || y < 0 || x >= (me.___textureBuffer != null?me.___textureBuffer.width:0) || y >= (me.___textureBuffer != null?me.___textureBuffer.height:0)) return false; + if(imageData.data[Math.round(4 * (y * (me.___textureBuffer != null?me.___textureBuffer.width:0) + x)) + 3] - firstAlphaThreshold > 0) return true; + return false; + case "Bitmap": + throw "bitmapData.hitTest with a second object of type Bitmap is currently not supported for HTML5"; + return false; + case "BitmapData": + throw "bitmapData.hitTest with a second object of type BitmapData is currently not supported for HTML5"; + return false; + default: + throw "BitmapData::hitTest secondObject argument must be either a Rectangle, a Point, a Bitmap or a BitmapData object."; + return false; + } + }; + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); + return doHitTest(imageData); + } else return doHitTest(this.__imageData); } - ,__queueStageEvent: function(evt) { - this.__uIEventsQueue[this.__uIEventsQueueIndex++] = evt; + ,handle: function() { + return this.___textureBuffer; } - ,__processStageEvent: function(evt) { - evt.stopPropagation(); - switch(evt.type) { - case "resize": - this.__onResize(flash.Lib.__getWidth(),flash.Lib.__getHeight()); - break; - case "focus": - this.__onFocus(this); - if(!this.__focusObjectActivated) { - this.__focusObjectActivated = true; - this.dispatchEvent(new flash.events.Event(flash.events.Event.ACTIVATE)); + ,getPixels: function(rect) { + var len = Math.round(4 * rect.width * rect.height); + var byteArray = new flash.utils.ByteArray(); + if(byteArray.allocated < len) byteArray.___resizeBuffer(byteArray.allocated = Math.max(len,byteArray.allocated * 2) | 0); else if(byteArray.allocated > len) byteArray.___resizeBuffer(byteArray.allocated = len); + byteArray.length = len; + len; + rect = this.clipRect(rect); + if(rect == null) return byteArray; + if(!this.__locked) { + var ctx = this.___textureBuffer.getContext("2d"); + var imagedata = ctx.getImageData(rect.x,rect.y,rect.width,rect.height); + var _g = 0; + while(_g < len) { + var i = _g++; + byteArray.writeByte(imagedata.data[i]); } - break; - case "blur": - if(this.__focusObjectActivated) { - this.__focusObjectActivated = false; - this.dispatchEvent(new flash.events.Event(flash.events.Event.DEACTIVATE)); + } else { + var offset = Math.round(4 * this.__imageData.width * rect.y + rect.x * 4); + var pos = offset; + var boundR = Math.round(4 * (rect.x + rect.width)); + var _g = 0; + while(_g < len) { + var i = _g++; + if(pos % (this.__imageData.width * 4) > boundR - 1) pos += this.__imageData.width * 4 - boundR; + byteArray.writeByte(this.__imageData.data[pos]); + pos++; } - break; - case "mousemove": - this.__onMouse(evt,flash.events.MouseEvent.MOUSE_MOVE); - break; - case "mousedown": - this.__onMouse(evt,flash.events.MouseEvent.MOUSE_DOWN); - break; - case "mouseup": - this.__onMouse(evt,flash.events.MouseEvent.MOUSE_UP); - break; - case "click": - this.__onMouse(evt,flash.events.MouseEvent.CLICK); - break; - case "mousewheel": - this.__onMouse(evt,flash.events.MouseEvent.MOUSE_WHEEL); - break; - case "dblclick": - this.__onMouse(evt,flash.events.MouseEvent.DOUBLE_CLICK); - break; - case "keydown": - var evt1 = evt; - var keyCode = evt1.keyCode != null?evt1.keyCode:evt1.which; - keyCode = flash.ui.Keyboard.__convertMozillaCode(keyCode); - this.__onKey(keyCode,true,evt1.charCode,evt1.ctrlKey,evt1.altKey,evt1.shiftKey,evt1.keyLocation); - break; - case "keyup": - var evt1 = evt; - var keyCode = evt1.keyCode != null?evt1.keyCode:evt1.which; - keyCode = flash.ui.Keyboard.__convertMozillaCode(keyCode); - this.__onKey(keyCode,false,evt1.charCode,evt1.ctrlKey,evt1.altKey,evt1.shiftKey,evt1.keyLocation); - break; - case "touchstart": - var evt1 = evt; - evt1.preventDefault(); - var touchInfo = new flash.display._Stage.TouchInfo(); - this.__touchInfo[evt1.changedTouches[0].identifier] = touchInfo; - this.__onTouch(evt1,evt1.changedTouches[0],"touchBegin",touchInfo,false); - break; - case "touchmove": - var evt1 = evt; - evt1.preventDefault(); - var touchInfo = this.__touchInfo[evt1.changedTouches[0].identifier]; - this.__onTouch(evt1,evt1.changedTouches[0],"touchMove",touchInfo,true); - break; - case "touchend": - var evt1 = evt; - evt1.preventDefault(); - var touchInfo = this.__touchInfo[evt1.changedTouches[0].identifier]; - this.__onTouch(evt1,evt1.changedTouches[0],"touchEnd",touchInfo,true); - this.__touchInfo[evt1.changedTouches[0].identifier] = null; - break; - case "devicemotion": - var evt1 = evt; - this.__handleAccelerometer(evt1); - break; - case "orientationchange": - this.__handleOrientationChange(); - break; - default: } + byteArray.position = 0; + return byteArray; } - ,__isOnStage: function() { - return true; + ,getPixel32: function(x,y) { + if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return 0; + if(!this.__locked) { + var ctx = this.___textureBuffer.getContext("2d"); + return this.getInt32(0,ctx.getImageData(x,y,1,1).data); + } else return this.getInt32(4 * y * this.___textureBuffer.width + x * 4,this.__imageData.data); } - ,__drag: function(point) { - var p = this.__dragObject.parent; - if(p != null) point = p.globalToLocal(point); - var x = point.x + this.__dragOffsetX; - var y = point.y + this.__dragOffsetY; - if(this.__dragBounds != null) { - if(x < this.__dragBounds.x) x = this.__dragBounds.x; else if(x > this.__dragBounds.get_right()) x = this.__dragBounds.get_right(); - if(y < this.__dragBounds.y) y = this.__dragBounds.y; else if(y > this.__dragBounds.get_bottom()) y = this.__dragBounds.get_bottom(); + ,getPixel: function(x,y) { + if(x < 0 || y < 0 || x >= (this.___textureBuffer != null?this.___textureBuffer.width:0) || y >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) return 0; + if(!this.__locked) { + var ctx = this.___textureBuffer.getContext("2d"); + var imagedata = ctx.getImageData(x,y,1,1); + return imagedata.data[0] << 16 | imagedata.data[1] << 8 | imagedata.data[2]; + } else { + var offset = 4 * y * (this.___textureBuffer != null?this.___textureBuffer.width:0) + x * 4; + return this.__imageData.data[offset] << 16 | this.__imageData.data[offset + 1] << 8 | this.__imageData.data[offset + 2]; } - this.__dragObject.set_x(x); - this.__dragObject.set_y(y); } - ,__checkInOuts: function(event,stack,touchInfo) { - var prev = touchInfo == null?this.__mouseOverObjects:touchInfo.touchOverObjects; - var changeEvents = touchInfo == null?flash.display.Stage.__mouseChanges:flash.display.Stage.__touchChanges; - var new_n = stack.length; - var new_obj = new_n > 0?stack[new_n - 1]:null; - var old_n = prev.length; - var old_obj = old_n > 0?prev[old_n - 1]:null; - if(new_obj != old_obj) { - if(old_obj != null) old_obj.__fireEvent(event.__createSimilar(changeEvents[0],new_obj,old_obj)); - if(new_obj != null) new_obj.__fireEvent(event.__createSimilar(changeEvents[1],old_obj,new_obj)); - var common = 0; - while(common < new_n && common < old_n && stack[common] == prev[common]) common++; - var rollOut = event.__createSimilar(changeEvents[2],new_obj,old_obj); - var i = old_n - 1; - while(i >= common) { - prev[i].dispatchEvent(rollOut); - i--; + ,getInt32: function(offset,data) { + return (this.__transparent?data[offset + 3]:255) << 24 | data[offset] << 16 | data[offset + 1] << 8 | data[offset + 2]; + } + ,getColorBoundsRect: function(mask,color,findColor) { + if(findColor == null) findColor = true; + var me = this; + var doGetColorBoundsRect = function(data) { + var minX = me.___textureBuffer != null?me.___textureBuffer.width:0, maxX = 0, minY = me.___textureBuffer != null?me.___textureBuffer.height:0, maxY = 0, i = 0; + while(i < data.length) { + var value = me.getInt32(i,data); + if(findColor) { + if((value & mask) == color) { + var x = Math.round(i % ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4) / 4); + var y = Math.round(i / ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4)); + if(x < minX) minX = x; + if(x > maxX) maxX = x; + if(y < minY) minY = y; + if(y > maxY) maxY = y; + } + } else if((value & mask) != color) { + var x = Math.round(i % ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4) / 4); + var y = Math.round(i / ((me.___textureBuffer != null?me.___textureBuffer.width:0) * 4)); + if(x < minX) minX = x; + if(x > maxX) maxX = x; + if(y < minY) minY = y; + if(y > maxY) maxY = y; + } + i += 4; + } + if(minX < maxX && minY < maxY) return new flash.geom.Rectangle(minX,minY,maxX - minX + 1,maxY - minY); else return new flash.geom.Rectangle(0,0,me.___textureBuffer != null?me.___textureBuffer.width:0,me.___textureBuffer != null?me.___textureBuffer.height:0); + }; + if(!this.__locked) { + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); + return doGetColorBoundsRect(imageData.data); + } else return doGetColorBoundsRect(this.__imageData.data); + } + ,floodFill: function(x,y,color) { + var wasLocked = this.__locked; + if(!this.__locked) this.lock(); + var queue = new Array(); + queue.push(new flash.geom.Point(x,y)); + var old = this.getPixel32(x,y); + var iterations = 0; + var search = new Array(); + var _g1 = 0, _g = (this.___textureBuffer != null?this.___textureBuffer.width:0) + 1; + while(_g1 < _g) { + var i = _g1++; + var column = new Array(); + var _g3 = 0, _g2 = (this.___textureBuffer != null?this.___textureBuffer.height:0) + 1; + while(_g3 < _g2) { + var i1 = _g3++; + column.push(false); + } + search.push(column); + } + var currPoint, newPoint; + while(queue.length > 0) { + currPoint = queue.shift(); + ++iterations; + var x1 = currPoint.x | 0; + var y1 = currPoint.y | 0; + if(x1 < 0 || x1 >= (this.___textureBuffer != null?this.___textureBuffer.width:0)) continue; + if(y1 < 0 || y1 >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) continue; + search[x1][y1] = true; + if(this.getPixel32(x1,y1) == old) { + this.setPixel32(x1,y1,color); + if(!search[x1 + 1][y1]) queue.push(new flash.geom.Point(x1 + 1,y1)); + if(!search[x1][y1 + 1]) queue.push(new flash.geom.Point(x1,y1 + 1)); + if(x1 > 0 && !search[x1 - 1][y1]) queue.push(new flash.geom.Point(x1 - 1,y1)); + if(y1 > 0 && !search[x1][y1 - 1]) queue.push(new flash.geom.Point(x1,y1 - 1)); + } + } + if(!wasLocked) this.unlock(); + } + ,fillRect: function(rect,color) { + if(rect == null) return; + if(rect.width <= 0 || rect.height <= 0) return; + if(rect.x == 0 && rect.y == 0 && rect.width == this.___textureBuffer.width && rect.height == this.___textureBuffer.height) { + if(this.__transparent) { + if(color >>> 24 == 0 || color == this.__initColor) return this.__clearCanvas(); + } else if((color | -16777216) == (this.__initColor | -16777216)) return this.__clearCanvas(); + } + return this.__fillRect(rect,color); + } + ,drawToSurface: function(inSurface,matrix,inColorTransform,blendMode,clipRect,smoothing) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = inSurface.getContext("2d"); + if(matrix != null) { + ctx.save(); + if(matrix.a == 1 && matrix.b == 0 && matrix.c == 0 && matrix.d == 1) ctx.translate(matrix.tx,matrix.ty); else { + flash.Lib.__setImageSmoothing(ctx,smoothing); + ctx.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.tx,matrix.ty); + } + ctx.drawImage(this.___textureBuffer,0,0); + ctx.restore(); + } else ctx.drawImage(this.___textureBuffer,0,0); + if(inColorTransform != null) this.colorTransform(new flash.geom.Rectangle(0,0,this.___textureBuffer.width,this.___textureBuffer.height),inColorTransform); + } + ,draw: function(source,matrix,inColorTransform,blendMode,clipRect,smoothing) { + if(smoothing == null) smoothing = false; + this.__lease.set(this.__leaseNum++,new Date().getTime()); + source.drawToSurface(this.___textureBuffer,matrix,inColorTransform,blendMode,clipRect,smoothing); + if(inColorTransform != null) { + var rect = new flash.geom.Rectangle(); + var object = source; + rect.x = matrix != null?matrix.tx:0; + rect.y = matrix != null?matrix.ty:0; + try { + rect.width = Reflect.getProperty(source,"width"); + rect.height = Reflect.getProperty(source,"height"); + } catch( e ) { + rect.width = this.___textureBuffer.width; + rect.height = this.___textureBuffer.height; + } + this.colorTransform(rect,inColorTransform); + } + } + ,dispose: function() { + this.__clearCanvas(); + this.___textureBuffer = null; + this.__leaseNum = 0; + this.__lease = null; + this.__imageData = null; + } + ,destroy: function() { + this.___textureBuffer = null; + } + ,copyPixels: function(sourceBitmapData,sourceRect,destPoint,alphaBitmapData,alphaPoint,mergeAlpha) { + if(mergeAlpha == null) mergeAlpha = false; + if(sourceBitmapData.___textureBuffer == null || this.___textureBuffer == null || sourceBitmapData.___textureBuffer.width == 0 || sourceBitmapData.___textureBuffer.height == 0 || sourceRect.width <= 0 || sourceRect.height <= 0) return; + if(sourceRect.x + sourceRect.width > sourceBitmapData.___textureBuffer.width) sourceRect.width = sourceBitmapData.___textureBuffer.width - sourceRect.x; + if(sourceRect.y + sourceRect.height > sourceBitmapData.___textureBuffer.height) sourceRect.height = sourceBitmapData.___textureBuffer.height - sourceRect.y; + if(alphaBitmapData != null && alphaBitmapData.__transparent) { + if(alphaPoint == null) alphaPoint = new flash.geom.Point(); + var bitmapData = new flash.display.BitmapData(sourceBitmapData.___textureBuffer != null?sourceBitmapData.___textureBuffer.width:0,sourceBitmapData.___textureBuffer != null?sourceBitmapData.___textureBuffer.height:0,true); + bitmapData.copyPixels(sourceBitmapData,sourceRect,new flash.geom.Point(sourceRect.x,sourceRect.y)); + bitmapData.copyChannel(alphaBitmapData,new flash.geom.Rectangle(alphaPoint.x,alphaPoint.y,sourceRect.width,sourceRect.height),new flash.geom.Point(sourceRect.x,sourceRect.y),8,8); + sourceBitmapData = bitmapData; + } + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + if(!mergeAlpha) { + if(this.__transparent && sourceBitmapData.__transparent) { + var trpCtx = sourceBitmapData.__transparentFiller.getContext("2d"); + var trpData = trpCtx.getImageData(sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height); + ctx.putImageData(trpData,destPoint.x,destPoint.y); + } + } + ctx.drawImage(sourceBitmapData.___textureBuffer,sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height,destPoint.x,destPoint.y,sourceRect.width,sourceRect.height); + } else this.__copyPixelList[this.__copyPixelList.length] = { handle : sourceBitmapData.___textureBuffer, transparentFiller : mergeAlpha?null:sourceBitmapData.__transparentFiller, sourceX : sourceRect.x, sourceY : sourceRect.y, sourceWidth : sourceRect.width, sourceHeight : sourceRect.height, destX : destPoint.x, destY : destPoint.y}; + } + ,copyChannel: function(sourceBitmapData,sourceRect,destPoint,sourceChannel,destChannel) { + this.rect = this.clipRect(this.rect); + if(this.rect == null) return; + if(destChannel == 8 && !this.__transparent) return; + if(sourceBitmapData.___textureBuffer == null || this.___textureBuffer == null || sourceRect.width <= 0 || sourceRect.height <= 0) return; + if(sourceRect.x + sourceRect.width > sourceBitmapData.___textureBuffer.width) sourceRect.width = sourceBitmapData.___textureBuffer.width - sourceRect.x; + if(sourceRect.y + sourceRect.height > sourceBitmapData.___textureBuffer.height) sourceRect.height = sourceBitmapData.___textureBuffer.height - sourceRect.y; + var doChannelCopy = function(imageData) { + var srcCtx = sourceBitmapData.___textureBuffer.getContext("2d"); + var srcImageData = srcCtx.getImageData(sourceRect.x,sourceRect.y,sourceRect.width,sourceRect.height); + var destIdx = -1; + if(destChannel == 8) destIdx = 3; else if(destChannel == 4) destIdx = 2; else if(destChannel == 2) destIdx = 1; else if(destChannel == 1) destIdx = 0; else throw "Invalid destination BitmapDataChannel passed to BitmapData::copyChannel."; + var pos = 4 * (Math.round(destPoint.x) + Math.round(destPoint.y) * imageData.width) + destIdx; + var boundR = Math.round(4 * (destPoint.x + sourceRect.width)); + var setPos = function(val) { + if(pos % (imageData.width * 4) > boundR - 1) pos += imageData.width * 4 - boundR; + imageData.data[pos] = val; + pos += 4; + }; + var srcIdx = -1; + if(sourceChannel == 8) srcIdx = 3; else if(sourceChannel == 4) srcIdx = 2; else if(sourceChannel == 2) srcIdx = 1; else if(sourceChannel == 1) srcIdx = 0; else throw "Invalid source BitmapDataChannel passed to BitmapData::copyChannel."; + while(srcIdx < srcImageData.data.length) { + setPos(srcImageData.data[srcIdx]); + srcIdx += 4; + } + }; + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var imageData = ctx.getImageData(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); + doChannelCopy(imageData); + ctx.putImageData(imageData,0,0); + } else { + doChannelCopy(this.__imageData); + this.__imageDataChanged = true; + } + } + ,compare: function(inBitmapTexture) { + throw "bitmapData.compare is currently not supported for HTML5"; + return 0; + } + ,colorTransform: function(rect,colorTransform) { + if(rect == null) return; + rect = this.clipRect(rect); + if(!this.__locked) { + this.__lease.set(this.__leaseNum++,new Date().getTime()); + var ctx = this.___textureBuffer.getContext("2d"); + var imagedata = ctx.getImageData(rect.x,rect.y,rect.width,rect.height); + var offsetX; + var _g1 = 0, _g = imagedata.data.length >> 2; + while(_g1 < _g) { + var i = _g1++; + offsetX = i * 4; + imagedata.data[offsetX] = imagedata.data[offsetX] * colorTransform.redMultiplier + colorTransform.redOffset | 0; + imagedata.data[offsetX + 1] = imagedata.data[offsetX + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset | 0; + imagedata.data[offsetX + 2] = imagedata.data[offsetX + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset | 0; + imagedata.data[offsetX + 3] = imagedata.data[offsetX + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset | 0; + } + ctx.putImageData(imagedata,rect.x,rect.y); + } else { + var s = 4 * (Math.round(rect.x) + Math.round(rect.y) * this.__imageData.width); + var offsetY; + var offsetX; + var _g1 = 0, _g = Math.round(rect.height); + while(_g1 < _g) { + var i = _g1++; + offsetY = i * this.__imageData.width; + var _g3 = 0, _g2 = Math.round(rect.width); + while(_g3 < _g2) { + var j = _g3++; + offsetX = 4 * (j + offsetY); + this.__imageData.data[s + offsetX] = this.__imageData.data[s + offsetX] * colorTransform.redMultiplier + colorTransform.redOffset | 0; + this.__imageData.data[s + offsetX + 1] = this.__imageData.data[s + offsetX + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset | 0; + this.__imageData.data[s + offsetX + 2] = this.__imageData.data[s + offsetX + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset | 0; + this.__imageData.data[s + offsetX + 3] = this.__imageData.data[s + offsetX + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset | 0; + } + } + this.__imageDataChanged = true; + } + } + ,clone: function() { + var bitmapData = new flash.display.BitmapData(this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0,this.__transparent); + var rect = new flash.geom.Rectangle(0,0,this.___textureBuffer != null?this.___textureBuffer.width:0,this.___textureBuffer != null?this.___textureBuffer.height:0); + bitmapData.setPixels(rect,this.getPixels(rect)); + bitmapData.__lease.set(bitmapData.__leaseNum++,new Date().getTime()); + return bitmapData; + } + ,clipRect: function(r) { + if(r.x < 0) { + r.width -= -r.x; + r.x = 0; + if(r.x + r.width <= 0) return null; + } + if(r.y < 0) { + r.height -= -r.y; + r.y = 0; + if(r.y + r.height <= 0) return null; + } + if(r.x + r.width >= (this.___textureBuffer != null?this.___textureBuffer.width:0)) { + r.width -= r.x + r.width - (this.___textureBuffer != null?this.___textureBuffer.width:0); + if(r.width <= 0) return null; + } + if(r.y + r.height >= (this.___textureBuffer != null?this.___textureBuffer.height:0)) { + r.height -= r.y + r.height - (this.___textureBuffer != null?this.___textureBuffer.height:0); + if(r.height <= 0) return null; + } + return r; + } + ,clear: function(color) { + this.fillRect(this.rect,color); + } + ,applyFilter: function(sourceBitmapData,sourceRect,destPoint,filter) { + if(sourceBitmapData == this && sourceRect.x == destPoint.x && sourceRect.y == destPoint.y) filter.__applyFilter(this.___textureBuffer,sourceRect); else { + var bitmapData = new flash.display.BitmapData(sourceRect.width | 0,sourceRect.height | 0); + bitmapData.copyPixels(sourceBitmapData,sourceRect,new flash.geom.Point()); + filter.__applyFilter(bitmapData.___textureBuffer); + this.copyPixels(bitmapData,bitmapData.rect,destPoint); + } + } + ,__class__: flash.display.BitmapData + ,__properties__: {get_height:"get_height",get_transparent:"get_transparent",get_width:"get_width"} +} +flash.display.ImageDataLease = function() { +}; +$hxClasses["flash.display.ImageDataLease"] = flash.display.ImageDataLease; +flash.display.ImageDataLease.__name__ = ["flash","display","ImageDataLease"]; +flash.display.ImageDataLease.prototype = { + set: function(s,t) { + this.seed = s; + this.time = t; + } + ,clone: function() { + var leaseClone = new flash.display.ImageDataLease(); + leaseClone.seed = this.seed; + leaseClone.time = this.time; + return leaseClone; + } + ,__class__: flash.display.ImageDataLease +} +flash.display._BitmapData = {} +flash.display._BitmapData.MinstdGenerator = function(seed) { + if(seed == 0) this.value = 1; else this.value = seed; +}; +$hxClasses["flash.display._BitmapData.MinstdGenerator"] = flash.display._BitmapData.MinstdGenerator; +flash.display._BitmapData.MinstdGenerator.__name__ = ["flash","display","_BitmapData","MinstdGenerator"]; +flash.display._BitmapData.MinstdGenerator.prototype = { + nextValue: function() { + var lo = 16807 * (this.value & 65535); + var hi = 16807 * (this.value >>> 16); + lo += (hi & 32767) << 16; + if(lo < 0 || lo > -2147483648 - 1) { + lo &= -2147483648 - 1; + ++lo; + } + lo += hi >>> 15; + if(lo < 0 || lo > -2147483648 - 1) { + lo &= -2147483648 - 1; + ++lo; + } + return this.value = lo; + } + ,__class__: flash.display._BitmapData.MinstdGenerator +} +flash.display.BitmapDataChannel = function() { } +$hxClasses["flash.display.BitmapDataChannel"] = flash.display.BitmapDataChannel; +flash.display.BitmapDataChannel.__name__ = ["flash","display","BitmapDataChannel"]; +flash.display.BlendMode = $hxClasses["flash.display.BlendMode"] = { __ename__ : true, __constructs__ : ["ADD","ALPHA","DARKEN","DIFFERENCE","ERASE","HARDLIGHT","INVERT","LAYER","LIGHTEN","MULTIPLY","NORMAL","OVERLAY","SCREEN","SUBTRACT"] } +flash.display.BlendMode.ADD = ["ADD",0]; +flash.display.BlendMode.ADD.toString = $estr; +flash.display.BlendMode.ADD.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.ALPHA = ["ALPHA",1]; +flash.display.BlendMode.ALPHA.toString = $estr; +flash.display.BlendMode.ALPHA.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.DARKEN = ["DARKEN",2]; +flash.display.BlendMode.DARKEN.toString = $estr; +flash.display.BlendMode.DARKEN.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.DIFFERENCE = ["DIFFERENCE",3]; +flash.display.BlendMode.DIFFERENCE.toString = $estr; +flash.display.BlendMode.DIFFERENCE.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.ERASE = ["ERASE",4]; +flash.display.BlendMode.ERASE.toString = $estr; +flash.display.BlendMode.ERASE.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.HARDLIGHT = ["HARDLIGHT",5]; +flash.display.BlendMode.HARDLIGHT.toString = $estr; +flash.display.BlendMode.HARDLIGHT.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.INVERT = ["INVERT",6]; +flash.display.BlendMode.INVERT.toString = $estr; +flash.display.BlendMode.INVERT.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.LAYER = ["LAYER",7]; +flash.display.BlendMode.LAYER.toString = $estr; +flash.display.BlendMode.LAYER.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.LIGHTEN = ["LIGHTEN",8]; +flash.display.BlendMode.LIGHTEN.toString = $estr; +flash.display.BlendMode.LIGHTEN.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.MULTIPLY = ["MULTIPLY",9]; +flash.display.BlendMode.MULTIPLY.toString = $estr; +flash.display.BlendMode.MULTIPLY.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.NORMAL = ["NORMAL",10]; +flash.display.BlendMode.NORMAL.toString = $estr; +flash.display.BlendMode.NORMAL.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.OVERLAY = ["OVERLAY",11]; +flash.display.BlendMode.OVERLAY.toString = $estr; +flash.display.BlendMode.OVERLAY.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.SCREEN = ["SCREEN",12]; +flash.display.BlendMode.SCREEN.toString = $estr; +flash.display.BlendMode.SCREEN.__enum__ = flash.display.BlendMode; +flash.display.BlendMode.SUBTRACT = ["SUBTRACT",13]; +flash.display.BlendMode.SUBTRACT.toString = $estr; +flash.display.BlendMode.SUBTRACT.__enum__ = flash.display.BlendMode; +flash.display.CapsStyle = $hxClasses["flash.display.CapsStyle"] = { __ename__ : true, __constructs__ : ["NONE","ROUND","SQUARE"] } +flash.display.CapsStyle.NONE = ["NONE",0]; +flash.display.CapsStyle.NONE.toString = $estr; +flash.display.CapsStyle.NONE.__enum__ = flash.display.CapsStyle; +flash.display.CapsStyle.ROUND = ["ROUND",1]; +flash.display.CapsStyle.ROUND.toString = $estr; +flash.display.CapsStyle.ROUND.__enum__ = flash.display.CapsStyle; +flash.display.CapsStyle.SQUARE = ["SQUARE",2]; +flash.display.CapsStyle.SQUARE.toString = $estr; +flash.display.CapsStyle.SQUARE.__enum__ = flash.display.CapsStyle; +flash.display.GradientType = $hxClasses["flash.display.GradientType"] = { __ename__ : true, __constructs__ : ["RADIAL","LINEAR"] } +flash.display.GradientType.RADIAL = ["RADIAL",0]; +flash.display.GradientType.RADIAL.toString = $estr; +flash.display.GradientType.RADIAL.__enum__ = flash.display.GradientType; +flash.display.GradientType.LINEAR = ["LINEAR",1]; +flash.display.GradientType.LINEAR.toString = $estr; +flash.display.GradientType.LINEAR.__enum__ = flash.display.GradientType; +flash.display.Graphics = function(inSurface) { + flash.Lib.__bootstrap(); + if(inSurface == null) { + this.__surface = js.Browser.document.createElement("canvas"); + this.__surface.width = 0; + this.__surface.height = 0; + } else this.__surface = inSurface; + this.mLastMoveID = 0; + this.mPenX = 0.0; + this.mPenY = 0.0; + this.mDrawList = new Array(); + this.mPoints = []; + this.mSolidGradient = null; + this.mBitmap = null; + this.mFilling = false; + this.mFillColour = 0; + this.mFillAlpha = 0.0; + this.mLastMoveID = 0; + this.boundsDirty = true; + this.__clearLine(); + this.mLineJobs = []; + this.__changed = true; + this.nextDrawIndex = 0; + this.__extent = new flash.geom.Rectangle(); + this.__extentWithFilters = new flash.geom.Rectangle(); + this._padding = 0.0; + this.__clearNextCycle = true; +}; +$hxClasses["flash.display.Graphics"] = flash.display.Graphics; +flash.display.Graphics.__name__ = ["flash","display","Graphics"]; +flash.display.Graphics.__detectIsPointInPathMode = function() { + var canvas = js.Browser.document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + if(ctx.isPointInPath == null) return flash.display.PointInPathMode.USER_SPACE; + ctx.save(); + ctx.translate(1,0); + ctx.beginPath(); + ctx.rect(0,0,1,1); + var rv = ctx.isPointInPath(0.3,0.3)?flash.display.PointInPathMode.USER_SPACE:flash.display.PointInPathMode.DEVICE_SPACE; + ctx.restore(); + return rv; +} +flash.display.Graphics.prototype = { + __render: function(maskHandle,filters,sx,sy,clip0,clip1,clip2,clip3) { + if(sy == null) sy = 1.0; + if(sx == null) sx = 1.0; + if(!this.__changed) return false; + this.closePolygon(true); + var padding = this._padding; + if(filters != null) { + var _g = 0; + while(_g < filters.length) { + var filter = filters[_g]; + ++_g; + if(Reflect.hasField(filter,"blurX")) padding += Math.max(Reflect.field(filter,"blurX"),Reflect.field(filter,"blurY")) * 4; + } + } + this.__expandFilteredExtent(-(padding * sx) / 2,-(padding * sy) / 2); + if(this.__clearNextCycle) { + this.nextDrawIndex = 0; + this.__clearCanvas(); + this.__clearNextCycle = false; + } + if(this.__extentWithFilters.width - this.__extentWithFilters.x > this.__surface.width || this.__extentWithFilters.height - this.__extentWithFilters.y > this.__surface.height) this.__adjustSurface(sx,sy); + var ctx = (function($this) { + var $r; + try { + $r = $this.__surface.getContext("2d"); + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(ctx == null) return false; + if(clip0 != null) { + ctx.beginPath(); + ctx.moveTo(clip0.x * sx,clip0.y * sy); + ctx.lineTo(clip1.x * sx,clip1.y * sy); + ctx.lineTo(clip2.x * sx,clip2.y * sy); + ctx.lineTo(clip3.x * sx,clip3.y * sy); + ctx.closePath(); + ctx.clip(); + } + if(filters != null) { + var _g = 0; + while(_g < filters.length) { + var filter = filters[_g]; + ++_g; + if(js.Boot.__instanceof(filter,flash.filters.DropShadowFilter)) filter.__applyFilter(this.__surface,null,true); + } + } + var len = this.mDrawList.length; + ctx.save(); + if(this.__extentWithFilters.x != 0 || this.__extentWithFilters.y != 0) ctx.translate(-this.__extentWithFilters.x * sx,-this.__extentWithFilters.y * sy); + if(sx != 1 || sy != 0) ctx.scale(sx,sy); + var doStroke = false; + var _g = this.nextDrawIndex; + while(_g < len) { + var i = _g++; + var d = this.mDrawList[len - 1 - i]; + if(d.tileJob != null) this.__drawTiles(d.tileJob.sheet,d.tileJob.drawList,d.tileJob.flags); else { + if(d.lineJobs.length > 0) { + var _g1 = 0, _g2 = d.lineJobs; + while(_g1 < _g2.length) { + var lj = _g2[_g1]; + ++_g1; + ctx.lineWidth = lj.thickness; + switch(lj.joints) { + case 0: + ctx.lineJoin = "round"; + break; + case 4096: + ctx.lineJoin = "miter"; + break; + case 8192: + ctx.lineJoin = "bevel"; + break; + } + switch(lj.caps) { + case 256: + ctx.lineCap = "round"; + break; + case 512: + ctx.lineCap = "square"; + break; + case 0: + ctx.lineCap = "butt"; + break; + } + ctx.miterLimit = lj.miter_limit; + if(lj.grad != null) ctx.strokeStyle = this.createCanvasGradient(ctx,lj.grad); else ctx.strokeStyle = this.createCanvasColor(lj.colour,lj.alpha); + ctx.beginPath(); + var _g4 = lj.point_idx0, _g3 = lj.point_idx1 + 1; + while(_g4 < _g3) { + var i1 = _g4++; + var p = d.points[i1]; + switch(p.type) { + case 0: + ctx.moveTo(p.x,p.y); + break; + case 2: + ctx.quadraticCurveTo(p.cx,p.cy,p.x,p.y); + break; + default: + ctx.lineTo(p.x,p.y); + } + } + ctx.closePath(); + doStroke = true; + } + } else { + ctx.beginPath(); + var _g1 = 0, _g2 = d.points; + while(_g1 < _g2.length) { + var p = _g2[_g1]; + ++_g1; + switch(p.type) { + case 0: + ctx.moveTo(p.x,p.y); + break; + case 2: + ctx.quadraticCurveTo(p.cx,p.cy,p.x,p.y); + break; + default: + ctx.lineTo(p.x,p.y); + } + } + ctx.closePath(); + } + var fillColour = d.fillColour; + var fillAlpha = d.fillAlpha; + var g = d.solidGradient; + var bitmap = d.bitmap; + if(g != null) ctx.fillStyle = this.createCanvasGradient(ctx,g); else if(bitmap != null && (bitmap.flags & 16) > 0) { + var m = bitmap.matrix; + if(m != null) ctx.transform(m.a,m.b,m.c,m.d,m.tx,m.ty); + if((bitmap.flags & 65536) == 0) { + ctx.mozImageSmoothingEnabled = false; + ctx.webkitImageSmoothingEnabled = false; + } + ctx.fillStyle = ctx.createPattern(bitmap.texture_buffer,"repeat"); + } else ctx.fillStyle = this.createCanvasColor(fillColour,Math.min(1.0,Math.max(0.0,fillAlpha))); + ctx.fill(); + if(doStroke) ctx.stroke(); + ctx.save(); + if(bitmap != null && (bitmap.flags & 16) == 0) { + ctx.clip(); + var img = bitmap.texture_buffer; + var m = bitmap.matrix; + if(m != null) ctx.transform(m.a,m.b,m.c,m.d,m.tx,m.ty); + ctx.drawImage(img,0,0); + } + ctx.restore(); + } + } + ctx.restore(); + this.__changed = false; + this.nextDrawIndex = len > 0?len - 1:0; + this.mDrawList = []; + return true; + } + ,__mediaSurface: function(surface) { + this.__surface = surface; + } + ,__invalidate: function() { + this.__changed = true; + this.__clearNextCycle = true; + } + ,__hitTest: function(inX,inY) { + var ctx = (function($this) { + var $r; + try { + $r = $this.__surface.getContext("2d"); + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(ctx == null) return false; + if(ctx.isPointInPath(inX,inY)) return true; else if(this.mDrawList.length == 0 && this.__extent.width > 0 && this.__extent.height > 0) return true; + return false; + } + ,__expandStandardExtent: function(x,y,thickness) { + if(thickness == null) thickness = 0; + if(this._padding > 0) { + this.__extent.width -= this._padding; + this.__extent.height -= this._padding; + } + if(thickness != null && thickness > this._padding) this._padding = thickness; + var maxX, minX, maxY, minY; + minX = this.__extent.x; + minY = this.__extent.y; + maxX = this.__extent.width + minX; + maxY = this.__extent.height + minY; + maxX = x > maxX?x:maxX; + minX = x < minX?x:minX; + maxY = y > maxY?y:maxY; + minY = y < minY?y:minY; + this.__extent.x = minX; + this.__extent.y = minY; + this.__extent.width = maxX - minX + this._padding; + this.__extent.height = maxY - minY + this._padding; + this.boundsDirty = true; + } + ,__expandFilteredExtent: function(x,y) { + var maxX, minX, maxY, minY; + minX = this.__extent.x; + minY = this.__extent.y; + maxX = this.__extent.width + minX; + maxY = this.__extent.height + minY; + maxX = x > maxX?x:maxX; + minX = x < minX?x:minX; + maxY = y > maxY?y:maxY; + minY = y < minY?y:minY; + this.__extentWithFilters.x = minX; + this.__extentWithFilters.y = minY; + this.__extentWithFilters.width = maxX - minX; + this.__extentWithFilters.height = maxY - minY; + } + ,__drawTiles: function(sheet,tileData,flags) { + if(flags == null) flags = 0; + var useScale = (flags & 1) > 0; + var useRotation = (flags & 2) > 0; + var useTransform = (flags & 16) > 0; + var useRGB = (flags & 4) > 0; + var useAlpha = (flags & 8) > 0; + if(useTransform) { + useScale = false; + useRotation = false; + } + var scaleIndex = 0; + var rotationIndex = 0; + var rgbIndex = 0; + var alphaIndex = 0; + var transformIndex = 0; + var numValues = 3; + if(useScale) { + scaleIndex = numValues; + numValues++; + } + if(useRotation) { + rotationIndex = numValues; + numValues++; + } + if(useTransform) { + transformIndex = numValues; + numValues += 4; + } + if(useRGB) { + rgbIndex = numValues; + numValues += 3; + } + if(useAlpha) { + alphaIndex = numValues; + numValues++; + } + var totalCount = tileData.length; + var itemCount = totalCount / numValues | 0; + var index = 0; + var rect = null; + var center = null; + var previousTileID = -1; + var surface = sheet.__bitmap.___textureBuffer; + var ctx = (function($this) { + var $r; + try { + $r = $this.__surface.getContext("2d"); + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(ctx != null) while(index < totalCount) { + var tileID = tileData[index + 2] | 0; + if(tileID != previousTileID) { + rect = sheet.__tileRects[tileID]; + center = sheet.__centerPoints[tileID]; + previousTileID = tileID; + } + if(rect != null && center != null) { + ctx.save(); + ctx.translate(tileData[index],tileData[index + 1]); + if(useRotation) ctx.rotate(tileData[index + rotationIndex]); + var scale = 1.0; + if(useScale) scale = tileData[index + scaleIndex]; + if(useTransform) ctx.transform(tileData[index + transformIndex],tileData[index + transformIndex + 1],tileData[index + transformIndex + 2],tileData[index + transformIndex + 3],0,0); + if(useAlpha) ctx.globalAlpha = tileData[index + alphaIndex]; + ctx.drawImage(surface,rect.x,rect.y,rect.width,rect.height,-center.x * scale,-center.y * scale,rect.width * scale,rect.height * scale); + ctx.restore(); + } + index += numValues; + } + } + ,__drawEllipse: function(x,y,rx,ry) { + this.moveTo(x + rx,y); + this.curveTo(rx + x,-0.4142 * ry + y,0.7071 * rx + x,-0.7071 * ry + y); + this.curveTo(0.4142 * rx + x,-ry + y,x,-ry + y); + this.curveTo(-0.4142 * rx + x,-ry + y,-0.7071 * rx + x,-0.7071 * ry + y); + this.curveTo(-rx + x,-0.4142 * ry + y,-rx + x,y); + this.curveTo(-rx + x,0.4142 * ry + y,-0.7071 * rx + x,0.7071 * ry + y); + this.curveTo(-0.4142 * rx + x,ry + y,x,ry + y); + this.curveTo(0.4142 * rx + x,ry + y,0.7071 * rx + x,0.7071 * ry + y); + this.curveTo(rx + x,0.4142 * ry + y,rx + x,y); + } + ,__clearLine: function() { + this.mCurrentLine = new flash.display.LineJob(null,-1,-1,0.0,0.0,0,1,0,256,3,3.0); + } + ,__clearCanvas: function() { + if(this.__surface != null) { + var ctx = (function($this) { + var $r; + try { + $r = $this.__surface.getContext("2d"); + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(ctx != null) ctx.clearRect(0,0,this.__surface.width,this.__surface.height); + } + } + ,__adjustSurface: function(sx,sy) { + if(sy == null) sy = 1.0; + if(sx == null) sx = 1.0; + if(Reflect.field(this.__surface,"getContext") != null) { + var width = Math.ceil((this.__extentWithFilters.width - this.__extentWithFilters.x) * sx); + var height = Math.ceil((this.__extentWithFilters.height - this.__extentWithFilters.y) * sy); + if(width <= 5000 && height <= 5000) { + var dstCanvas = js.Browser.document.createElement("canvas"); + dstCanvas.width = width; + dstCanvas.height = height; + flash.Lib.__drawToSurface(this.__surface,dstCanvas); + if(flash.Lib.__isOnStage(this.__surface)) { + flash.Lib.__appendSurface(dstCanvas); + flash.Lib.__copyStyle(this.__surface,dstCanvas); + flash.Lib.__swapSurface(this.__surface,dstCanvas); + flash.Lib.__removeSurface(this.__surface); + if(this.__surface.id != null) flash.Lib.__setSurfaceId(dstCanvas,this.__surface.id); + } + this.__surface = dstCanvas; + } + } + } + ,moveTo: function(inX,inY) { + this.mPenX = inX; + this.mPenY = inY; + this.__expandStandardExtent(inX,inY); + if(!this.mFilling) this.closePolygon(false); else { + this.addLineSegment(); + this.mLastMoveID = this.mPoints.length; + this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); + } + } + ,lineTo: function(inX,inY) { + var pid = this.mPoints.length; + if(pid == 0) { + this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); + pid++; + } + this.mPenX = inX; + this.mPenY = inY; + this.__expandStandardExtent(inX,inY,this.mCurrentLine.thickness); + this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,1)); + if(this.mCurrentLine.grad != null || this.mCurrentLine.alpha > 0) { + if(this.mCurrentLine.point_idx0 < 0) this.mCurrentLine.point_idx0 = pid - 1; + this.mCurrentLine.point_idx1 = pid; + } + if(!this.mFilling) this.closePolygon(false); + } + ,lineStyle: function(thickness,color,alpha,pixelHinting,scaleMode,caps,joints,miterLimit) { + this.addLineSegment(); + if(thickness == null) { + this.__clearLine(); + return; + } else { + this.mCurrentLine.grad = null; + this.mCurrentLine.thickness = thickness; + this.mCurrentLine.colour = color == null?0:color; + this.mCurrentLine.alpha = alpha == null?1.0:alpha; + this.mCurrentLine.miter_limit = miterLimit == null?3.0:miterLimit; + this.mCurrentLine.pixel_hinting = pixelHinting == null || !pixelHinting?0:16384; + } + if(caps != null) { + switch( (caps)[1] ) { + case 1: + this.mCurrentLine.caps = 256; + break; + case 2: + this.mCurrentLine.caps = 512; + break; + case 0: + this.mCurrentLine.caps = 0; + break; + } + } + this.mCurrentLine.scale_mode = 3; + if(scaleMode != null) { + switch( (scaleMode)[1] ) { + case 2: + this.mCurrentLine.scale_mode = 3; + break; + case 3: + this.mCurrentLine.scale_mode = 1; + break; + case 0: + this.mCurrentLine.scale_mode = 2; + break; + case 1: + this.mCurrentLine.scale_mode = 0; + break; + } + } + this.mCurrentLine.joints = 0; + if(joints != null) { + switch( (joints)[1] ) { + case 1: + this.mCurrentLine.joints = 0; + break; + case 0: + this.mCurrentLine.joints = 4096; + break; + case 2: + this.mCurrentLine.joints = 8192; + break; + } + } + } + ,lineGradientStyle: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { + this.mCurrentLine.grad = this.createGradient(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio); + } + ,getContext: function() { + try { + return this.__surface.getContext("2d"); + } catch( e ) { + return null; + } + } + ,flush: function() { + this.closePolygon(true); + } + ,endFill: function() { + this.closePolygon(true); + } + ,drawTiles: function(sheet,tileData,smooth,flags) { + if(flags == null) flags = 0; + if(smooth == null) smooth = false; + this.__expandStandardExtent(flash.Lib.get_current().get_stage().get_stageWidth(),flash.Lib.get_current().get_stage().get_stageHeight()); + this.addDrawable(new flash.display.Drawable(null,null,null,null,null,null,new flash.display.TileJob(sheet,tileData,flags))); + this.__changed = true; + } + ,drawRoundRect: function(x,y,width,height,rx,ry) { + if(ry == null) ry = -1; + if(ry == -1) ry = rx; + rx *= 0.5; + ry *= 0.5; + var w = width * 0.5; + x += w; + if(rx > w) rx = w; + var lw = w - rx; + var w_ = lw + rx * Math.sin(Math.PI / 4); + var cw_ = lw + rx * Math.tan(Math.PI / 8); + var h = height * 0.5; + y += h; + if(ry > h) ry = h; + var lh = h - ry; + var h_ = lh + ry * Math.sin(Math.PI / 4); + var ch_ = lh + ry * Math.tan(Math.PI / 8); + this.closePolygon(false); + this.moveTo(x + w,y + lh); + this.curveTo(x + w,y + ch_,x + w_,y + h_); + this.curveTo(x + cw_,y + h,x + lw,y + h); + this.lineTo(x - lw,y + h); + this.curveTo(x - cw_,y + h,x - w_,y + h_); + this.curveTo(x - w,y + ch_,x - w,y + lh); + this.lineTo(x - w,y - lh); + this.curveTo(x - w,y - ch_,x - w_,y - h_); + this.curveTo(x - cw_,y - h,x - lw,y - h); + this.lineTo(x + lw,y - h); + this.curveTo(x + cw_,y - h,x + w_,y - h_); + this.curveTo(x + w,y - ch_,x + w,y - lh); + this.lineTo(x + w,y + lh); + this.closePolygon(false); + } + ,drawRect: function(x,y,width,height) { + this.closePolygon(false); + this.moveTo(x,y); + this.lineTo(x + width,y); + this.lineTo(x + width,y + height); + this.lineTo(x,y + height); + this.lineTo(x,y); + this.closePolygon(false); + } + ,drawGraphicsData: function(points) { + var $it0 = ((function(_e) { + return function() { + return $iterator(flash._Vector.Vector_Impl_)(_e); + }; + })(points))(); + while( $it0.hasNext() ) { + var data = $it0.next(); + if(data == null) this.mFilling = true; else switch(data.__graphicsDataType) { + case flash.display.GraphicsDataType.STROKE: + var stroke = data; + if(stroke.fill == null) this.lineStyle(stroke.thickness,0,1.,stroke.pixelHinting,stroke.scaleMode,stroke.caps,stroke.joints,stroke.miterLimit); else switch(stroke.fill.__graphicsFillType) { + case flash.display.GraphicsFillType.SOLID_FILL: + var fill = stroke.fill; + this.lineStyle(stroke.thickness,fill.color,fill.alpha,stroke.pixelHinting,stroke.scaleMode,stroke.caps,stroke.joints,stroke.miterLimit); + break; + case flash.display.GraphicsFillType.GRADIENT_FILL: + var fill = stroke.fill; + this.lineGradientStyle(fill.type,fill.colors,fill.alphas,fill.ratios,fill.matrix,fill.spreadMethod,fill.interpolationMethod,fill.focalPointRatio); + break; + } + break; + case flash.display.GraphicsDataType.PATH: + var path = data; + var j = 0; + var _g1 = 0, _g = flash._Vector.Vector_Impl_.get_length(path.commands); + while(_g1 < _g) { + var i = _g1++; + var command = path.commands[i]; + switch(command) { + case 1: + this.moveTo(path.data[j],path.data[j + 1]); + j = j + 2; + break; + case 2: + this.lineTo(path.data[j],path.data[j + 1]); + j = j + 2; + break; + case 3: + this.curveTo(path.data[j],path.data[j + 1],path.data[j + 2],path.data[j + 3]); + j = j + 4; + break; + } + } + break; + case flash.display.GraphicsDataType.SOLID: + var fill = data; + this.beginFill(fill.color,fill.alpha); + break; + case flash.display.GraphicsDataType.GRADIENT: + var fill = data; + this.beginGradientFill(fill.type,fill.colors,fill.alphas,fill.ratios,fill.matrix,fill.spreadMethod,fill.interpolationMethod,fill.focalPointRatio); + break; + } + } + } + ,drawEllipse: function(x,y,rx,ry) { + this.closePolygon(false); + rx /= 2; + ry /= 2; + this.__drawEllipse(x + rx,y + ry,rx,ry); + this.closePolygon(false); + } + ,drawCircle: function(x,y,rad) { + this.closePolygon(false); + this.__drawEllipse(x,y,rad,rad); + this.closePolygon(false); + } + ,curveTo: function(inCX,inCY,inX,inY) { + var pid = this.mPoints.length; + if(pid == 0) { + this.mPoints.push(new flash.display.GfxPoint(this.mPenX,this.mPenY,0.0,0.0,0)); + pid++; + } + this.mPenX = inX; + this.mPenY = inY; + this.__expandStandardExtent(inX,inY,this.mCurrentLine.thickness); + this.mPoints.push(new flash.display.GfxPoint(inX,inY,inCX,inCY,2)); + if(this.mCurrentLine.grad != null || this.mCurrentLine.alpha > 0) { + if(this.mCurrentLine.point_idx0 < 0) this.mCurrentLine.point_idx0 = pid - 1; + this.mCurrentLine.point_idx1 = pid; + } + } + ,createGradient: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { + var points = new Array(); + var _g1 = 0, _g = colors.length; + while(_g1 < _g) { + var i = _g1++; + points.push(new flash.display.GradPoint(colors[i],alphas[i],ratios[i])); + } + var flags = 0; + if(type == flash.display.GradientType.RADIAL) flags |= 1; + if(spreadMethod == flash.display.SpreadMethod.REPEAT) flags |= 2; else if(spreadMethod == flash.display.SpreadMethod.REFLECT) flags |= 4; + if(matrix == null) { + matrix = new flash.geom.Matrix(); + matrix.createGradientBox(25,25); + } else matrix = matrix.clone(); + var focal = focalPointRatio == null?0:focalPointRatio; + return new flash.display.Grad(points,matrix,flags,focal); + } + ,createCanvasGradient: function(ctx,g) { + var gradient; + var matrix = g.matrix; + if((g.flags & 1) == 0) { + var p1 = matrix.transformPoint(new flash.geom.Point(-819.2,0)); + var p2 = matrix.transformPoint(new flash.geom.Point(819.2,0)); + gradient = ctx.createLinearGradient(p1.x,p1.y,p2.x,p2.y); + } else { + var p1 = matrix.transformPoint(new flash.geom.Point(g.focal * 819.2,0)); + var p2 = matrix.transformPoint(new flash.geom.Point(0,819.2)); + gradient = ctx.createRadialGradient(p1.x,p1.y,0,p2.x,p1.y,p2.y); + } + var _g = 0, _g1 = g.points; + while(_g < _g1.length) { + var point = _g1[_g]; + ++_g; + var color = this.createCanvasColor(point.col,point.alpha); + var pos = point.ratio / 255; + gradient.addColorStop(pos,color); + } + return gradient; + } + ,createCanvasColor: function(color,alpha) { + var r = (16711680 & color) >> 16; + var g = (65280 & color) >> 8; + var b = 255 & color; + return "rgba" + "(" + r + "," + g + "," + b + "," + alpha + ")"; + } + ,closePolygon: function(inCancelFill) { + var l = this.mPoints.length; + if(l > 0) { + if(l > 1) { + if(this.mFilling && l > 2) { + if(this.mPoints[this.mLastMoveID].x != this.mPoints[l - 1].x || this.mPoints[this.mLastMoveID].y != this.mPoints[l - 1].y) this.lineTo(this.mPoints[this.mLastMoveID].x,this.mPoints[this.mLastMoveID].y); + } + this.addLineSegment(); + var drawable = new flash.display.Drawable(this.mPoints,this.mFillColour,this.mFillAlpha,this.mSolidGradient,this.mBitmap,this.mLineJobs,null); + this.addDrawable(drawable); + } + this.mLineJobs = []; + this.mPoints = []; + } + if(inCancelFill) { + this.mFillAlpha = 0; + this.mSolidGradient = null; + this.mBitmap = null; + this.mFilling = false; + } + this.__changed = true; + } + ,clear: function() { + this.__clearLine(); + this.mPenX = 0.0; + this.mPenY = 0.0; + this.mDrawList = new Array(); + this.nextDrawIndex = 0; + this.mPoints = []; + this.mSolidGradient = null; + this.mFilling = false; + this.mFillColour = 0; + this.mFillAlpha = 0.0; + this.mLastMoveID = 0; + this.__clearNextCycle = true; + this.boundsDirty = true; + this.__extent.x = 0.0; + this.__extent.y = 0.0; + this.__extent.width = 0.0; + this.__extent.height = 0.0; + this._padding = 0.0; + this.mLineJobs = []; + } + ,blit: function(inTexture) { + this.closePolygon(true); + var ctx = (function($this) { + var $r; + try { + $r = $this.__surface.getContext("2d"); + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(ctx != null) ctx.drawImage(inTexture.___textureBuffer,this.mPenX,this.mPenY); + } + ,beginGradientFill: function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { + this.closePolygon(true); + this.mFilling = true; + this.mBitmap = null; + this.mSolidGradient = this.createGradient(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio); + } + ,beginFill: function(color,alpha) { + this.closePolygon(true); + this.mFillColour = color; + this.mFillAlpha = alpha == null?1.0:alpha; + this.mFilling = true; + this.mSolidGradient = null; + this.mBitmap = null; + } + ,beginBitmapFill: function(bitmap,matrix,in_repeat,in_smooth) { + if(in_smooth == null) in_smooth = false; + if(in_repeat == null) in_repeat = true; + this.closePolygon(true); + var repeat = in_repeat == null?true:in_repeat; + var smooth = in_smooth == null?false:in_smooth; + this.mFilling = true; + this.mSolidGradient = null; + this.__expandStandardExtent(bitmap.___textureBuffer != null?bitmap.___textureBuffer.width:0,bitmap.___textureBuffer != null?bitmap.___textureBuffer.height:0); + this.mBitmap = { texture_buffer : bitmap.___textureBuffer, matrix : matrix == null?matrix:matrix.clone(), flags : (repeat?16:0) | (smooth?65536:0)}; + } + ,addLineSegment: function() { + if(this.mCurrentLine.point_idx1 > 0) this.mLineJobs.push(new flash.display.LineJob(this.mCurrentLine.grad,this.mCurrentLine.point_idx0,this.mCurrentLine.point_idx1,this.mCurrentLine.thickness,this.mCurrentLine.alpha,this.mCurrentLine.colour,this.mCurrentLine.pixel_hinting,this.mCurrentLine.joints,this.mCurrentLine.caps,this.mCurrentLine.scale_mode,this.mCurrentLine.miter_limit)); + this.mCurrentLine.point_idx0 = this.mCurrentLine.point_idx1 = -1; + } + ,addDrawable: function(inDrawable) { + if(inDrawable == null) return; + this.mDrawList.unshift(inDrawable); + } + ,__class__: flash.display.Graphics +} +flash.display.Drawable = function(inPoints,inFillColour,inFillAlpha,inSolidGradient,inBitmap,inLineJobs,inTileJob) { + this.points = inPoints; + this.fillColour = inFillColour; + this.fillAlpha = inFillAlpha; + this.solidGradient = inSolidGradient; + this.bitmap = inBitmap; + this.lineJobs = inLineJobs; + this.tileJob = inTileJob; +}; +$hxClasses["flash.display.Drawable"] = flash.display.Drawable; +flash.display.Drawable.__name__ = ["flash","display","Drawable"]; +flash.display.Drawable.prototype = { + __class__: flash.display.Drawable +} +flash.display.GfxPoint = function(inX,inY,inCX,inCY,inType) { + this.x = inX; + this.y = inY; + this.cx = inCX; + this.cy = inCY; + this.type = inType; +}; +$hxClasses["flash.display.GfxPoint"] = flash.display.GfxPoint; +flash.display.GfxPoint.__name__ = ["flash","display","GfxPoint"]; +flash.display.GfxPoint.prototype = { + __class__: flash.display.GfxPoint +} +flash.display.Grad = function(inPoints,inMatrix,inFlags,inFocal) { + this.points = inPoints; + this.matrix = inMatrix; + this.flags = inFlags; + this.focal = inFocal; +}; +$hxClasses["flash.display.Grad"] = flash.display.Grad; +flash.display.Grad.__name__ = ["flash","display","Grad"]; +flash.display.Grad.prototype = { + __class__: flash.display.Grad +} +flash.display.GradPoint = function(inCol,inAlpha,inRatio) { + this.col = inCol; + this.alpha = inAlpha; + this.ratio = inRatio; +}; +$hxClasses["flash.display.GradPoint"] = flash.display.GradPoint; +flash.display.GradPoint.__name__ = ["flash","display","GradPoint"]; +flash.display.GradPoint.prototype = { + __class__: flash.display.GradPoint +} +flash.display.LineJob = function(inGrad,inPoint_idx0,inPoint_idx1,inThickness,inAlpha,inColour,inPixel_hinting,inJoints,inCaps,inScale_mode,inMiter_limit) { + this.grad = inGrad; + this.point_idx0 = inPoint_idx0; + this.point_idx1 = inPoint_idx1; + this.thickness = inThickness; + this.alpha = inAlpha; + this.colour = inColour; + this.pixel_hinting = inPixel_hinting; + this.joints = inJoints; + this.caps = inCaps; + this.scale_mode = inScale_mode; + this.miter_limit = inMiter_limit; +}; +$hxClasses["flash.display.LineJob"] = flash.display.LineJob; +flash.display.LineJob.__name__ = ["flash","display","LineJob"]; +flash.display.LineJob.prototype = { + __class__: flash.display.LineJob +} +flash.display.PointInPathMode = $hxClasses["flash.display.PointInPathMode"] = { __ename__ : true, __constructs__ : ["USER_SPACE","DEVICE_SPACE"] } +flash.display.PointInPathMode.USER_SPACE = ["USER_SPACE",0]; +flash.display.PointInPathMode.USER_SPACE.toString = $estr; +flash.display.PointInPathMode.USER_SPACE.__enum__ = flash.display.PointInPathMode; +flash.display.PointInPathMode.DEVICE_SPACE = ["DEVICE_SPACE",1]; +flash.display.PointInPathMode.DEVICE_SPACE.toString = $estr; +flash.display.PointInPathMode.DEVICE_SPACE.__enum__ = flash.display.PointInPathMode; +flash.display.TileJob = function(sheet,drawList,flags) { + this.sheet = sheet; + this.drawList = drawList; + this.flags = flags; +}; +$hxClasses["flash.display.TileJob"] = flash.display.TileJob; +flash.display.TileJob.__name__ = ["flash","display","TileJob"]; +flash.display.TileJob.prototype = { + __class__: flash.display.TileJob +} +flash.display.IGraphicsFill = function() { } +$hxClasses["flash.display.IGraphicsFill"] = flash.display.IGraphicsFill; +flash.display.IGraphicsFill.__name__ = ["flash","display","IGraphicsFill"]; +flash.display.IGraphicsFill.prototype = { + __class__: flash.display.IGraphicsFill +} +flash.display.IGraphicsData = function() { } +$hxClasses["flash.display.IGraphicsData"] = flash.display.IGraphicsData; +flash.display.IGraphicsData.__name__ = ["flash","display","IGraphicsData"]; +flash.display.IGraphicsData.prototype = { + __class__: flash.display.IGraphicsData +} +flash.display.GraphicsGradientFill = function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio) { + if(focalPointRatio == null) focalPointRatio = 0; + this.type = type; + this.colors = colors; + this.alphas = alphas; + this.ratios = ratios; + this.matrix = matrix; + this.spreadMethod = spreadMethod; + this.interpolationMethod = interpolationMethod; + this.focalPointRatio = focalPointRatio; + this.__graphicsDataType = flash.display.GraphicsDataType.GRADIENT; + this.__graphicsFillType = flash.display.GraphicsFillType.GRADIENT_FILL; +}; +$hxClasses["flash.display.GraphicsGradientFill"] = flash.display.GraphicsGradientFill; +flash.display.GraphicsGradientFill.__name__ = ["flash","display","GraphicsGradientFill"]; +flash.display.GraphicsGradientFill.__interfaces__ = [flash.display.IGraphicsFill,flash.display.IGraphicsData]; +flash.display.GraphicsGradientFill.prototype = { + __class__: flash.display.GraphicsGradientFill +} +flash.display.IGraphicsPath = function() { } +$hxClasses["flash.display.IGraphicsPath"] = flash.display.IGraphicsPath; +flash.display.IGraphicsPath.__name__ = ["flash","display","IGraphicsPath"]; +flash.display.GraphicsPath = function(commands,data,winding) { + this.commands = commands; + this.data = data; + this.winding = winding; + this.__graphicsDataType = flash.display.GraphicsDataType.PATH; +}; +$hxClasses["flash.display.GraphicsPath"] = flash.display.GraphicsPath; +flash.display.GraphicsPath.__name__ = ["flash","display","GraphicsPath"]; +flash.display.GraphicsPath.__interfaces__ = [flash.display.IGraphicsPath,flash.display.IGraphicsData]; +flash.display.GraphicsPath.prototype = { + moveTo: function(x,y) { + if(this.commands != null && this.data != null) { + flash._Vector.Vector_Impl_.push(this.commands,1); + flash._Vector.Vector_Impl_.push(this.data,x); + flash._Vector.Vector_Impl_.push(this.data,y); + } + } + ,lineTo: function(x,y) { + if(this.commands != null && this.data != null) { + flash._Vector.Vector_Impl_.push(this.commands,2); + flash._Vector.Vector_Impl_.push(this.data,x); + flash._Vector.Vector_Impl_.push(this.data,y); + } + } + ,curveTo: function(controlX,controlY,anchorX,anchorY) { + if(this.commands != null && this.data != null) { + flash._Vector.Vector_Impl_.push(this.commands,3); + flash._Vector.Vector_Impl_.push(this.data,anchorX); + flash._Vector.Vector_Impl_.push(this.data,anchorY); + flash._Vector.Vector_Impl_.push(this.data,controlX); + flash._Vector.Vector_Impl_.push(this.data,controlY); + } + } + ,__class__: flash.display.GraphicsPath +} +flash.display.GraphicsPathCommand = function() { } +$hxClasses["flash.display.GraphicsPathCommand"] = flash.display.GraphicsPathCommand; +flash.display.GraphicsPathCommand.__name__ = ["flash","display","GraphicsPathCommand"]; +flash.display.GraphicsPathWinding = $hxClasses["flash.display.GraphicsPathWinding"] = { __ename__ : true, __constructs__ : ["EVEN_ODD","NON_ZERO"] } +flash.display.GraphicsPathWinding.EVEN_ODD = ["EVEN_ODD",0]; +flash.display.GraphicsPathWinding.EVEN_ODD.toString = $estr; +flash.display.GraphicsPathWinding.EVEN_ODD.__enum__ = flash.display.GraphicsPathWinding; +flash.display.GraphicsPathWinding.NON_ZERO = ["NON_ZERO",1]; +flash.display.GraphicsPathWinding.NON_ZERO.toString = $estr; +flash.display.GraphicsPathWinding.NON_ZERO.__enum__ = flash.display.GraphicsPathWinding; +flash.display.GraphicsSolidFill = function(color,alpha) { + if(alpha == null) alpha = 1; + if(color == null) color = 0; + this.alpha = alpha; + this.color = color; + this.__graphicsDataType = flash.display.GraphicsDataType.SOLID; + this.__graphicsFillType = flash.display.GraphicsFillType.SOLID_FILL; +}; +$hxClasses["flash.display.GraphicsSolidFill"] = flash.display.GraphicsSolidFill; +flash.display.GraphicsSolidFill.__name__ = ["flash","display","GraphicsSolidFill"]; +flash.display.GraphicsSolidFill.__interfaces__ = [flash.display.IGraphicsFill,flash.display.IGraphicsData]; +flash.display.GraphicsSolidFill.prototype = { + __class__: flash.display.GraphicsSolidFill +} +flash.display.IGraphicsStroke = function() { } +$hxClasses["flash.display.IGraphicsStroke"] = flash.display.IGraphicsStroke; +flash.display.IGraphicsStroke.__name__ = ["flash","display","IGraphicsStroke"]; +flash.display.GraphicsStroke = function(thickness,pixelHinting,scaleMode,caps,joints,miterLimit,fill) { + if(miterLimit == null) miterLimit = 3; + if(pixelHinting == null) pixelHinting = false; + if(thickness == null) thickness = 0.0; + this.caps = caps != null?caps:null; + this.fill = fill; + this.joints = joints != null?joints:null; + this.miterLimit = miterLimit; + this.pixelHinting = pixelHinting; + this.scaleMode = scaleMode != null?scaleMode:null; + this.thickness = thickness; + this.__graphicsDataType = flash.display.GraphicsDataType.STROKE; +}; +$hxClasses["flash.display.GraphicsStroke"] = flash.display.GraphicsStroke; +flash.display.GraphicsStroke.__name__ = ["flash","display","GraphicsStroke"]; +flash.display.GraphicsStroke.__interfaces__ = [flash.display.IGraphicsStroke,flash.display.IGraphicsData]; +flash.display.GraphicsStroke.prototype = { + __class__: flash.display.GraphicsStroke +} +flash.display.GraphicsDataType = $hxClasses["flash.display.GraphicsDataType"] = { __ename__ : true, __constructs__ : ["STROKE","SOLID","GRADIENT","PATH"] } +flash.display.GraphicsDataType.STROKE = ["STROKE",0]; +flash.display.GraphicsDataType.STROKE.toString = $estr; +flash.display.GraphicsDataType.STROKE.__enum__ = flash.display.GraphicsDataType; +flash.display.GraphicsDataType.SOLID = ["SOLID",1]; +flash.display.GraphicsDataType.SOLID.toString = $estr; +flash.display.GraphicsDataType.SOLID.__enum__ = flash.display.GraphicsDataType; +flash.display.GraphicsDataType.GRADIENT = ["GRADIENT",2]; +flash.display.GraphicsDataType.GRADIENT.toString = $estr; +flash.display.GraphicsDataType.GRADIENT.__enum__ = flash.display.GraphicsDataType; +flash.display.GraphicsDataType.PATH = ["PATH",3]; +flash.display.GraphicsDataType.PATH.toString = $estr; +flash.display.GraphicsDataType.PATH.__enum__ = flash.display.GraphicsDataType; +flash.display.GraphicsFillType = $hxClasses["flash.display.GraphicsFillType"] = { __ename__ : true, __constructs__ : ["SOLID_FILL","GRADIENT_FILL"] } +flash.display.GraphicsFillType.SOLID_FILL = ["SOLID_FILL",0]; +flash.display.GraphicsFillType.SOLID_FILL.toString = $estr; +flash.display.GraphicsFillType.SOLID_FILL.__enum__ = flash.display.GraphicsFillType; +flash.display.GraphicsFillType.GRADIENT_FILL = ["GRADIENT_FILL",1]; +flash.display.GraphicsFillType.GRADIENT_FILL.toString = $estr; +flash.display.GraphicsFillType.GRADIENT_FILL.__enum__ = flash.display.GraphicsFillType; +flash.display.InterpolationMethod = $hxClasses["flash.display.InterpolationMethod"] = { __ename__ : true, __constructs__ : ["RGB","LINEAR_RGB"] } +flash.display.InterpolationMethod.RGB = ["RGB",0]; +flash.display.InterpolationMethod.RGB.toString = $estr; +flash.display.InterpolationMethod.RGB.__enum__ = flash.display.InterpolationMethod; +flash.display.InterpolationMethod.LINEAR_RGB = ["LINEAR_RGB",1]; +flash.display.InterpolationMethod.LINEAR_RGB.toString = $estr; +flash.display.InterpolationMethod.LINEAR_RGB.__enum__ = flash.display.InterpolationMethod; +flash.display.JointStyle = $hxClasses["flash.display.JointStyle"] = { __ename__ : true, __constructs__ : ["MITER","ROUND","BEVEL"] } +flash.display.JointStyle.MITER = ["MITER",0]; +flash.display.JointStyle.MITER.toString = $estr; +flash.display.JointStyle.MITER.__enum__ = flash.display.JointStyle; +flash.display.JointStyle.ROUND = ["ROUND",1]; +flash.display.JointStyle.ROUND.toString = $estr; +flash.display.JointStyle.ROUND.__enum__ = flash.display.JointStyle; +flash.display.JointStyle.BEVEL = ["BEVEL",2]; +flash.display.JointStyle.BEVEL.toString = $estr; +flash.display.JointStyle.BEVEL.__enum__ = flash.display.JointStyle; +flash.display.LineScaleMode = $hxClasses["flash.display.LineScaleMode"] = { __ename__ : true, __constructs__ : ["HORIZONTAL","NONE","NORMAL","VERTICAL"] } +flash.display.LineScaleMode.HORIZONTAL = ["HORIZONTAL",0]; +flash.display.LineScaleMode.HORIZONTAL.toString = $estr; +flash.display.LineScaleMode.HORIZONTAL.__enum__ = flash.display.LineScaleMode; +flash.display.LineScaleMode.NONE = ["NONE",1]; +flash.display.LineScaleMode.NONE.toString = $estr; +flash.display.LineScaleMode.NONE.__enum__ = flash.display.LineScaleMode; +flash.display.LineScaleMode.NORMAL = ["NORMAL",2]; +flash.display.LineScaleMode.NORMAL.toString = $estr; +flash.display.LineScaleMode.NORMAL.__enum__ = flash.display.LineScaleMode; +flash.display.LineScaleMode.VERTICAL = ["VERTICAL",3]; +flash.display.LineScaleMode.VERTICAL.toString = $estr; +flash.display.LineScaleMode.VERTICAL.__enum__ = flash.display.LineScaleMode; +flash.display.Loader = function() { + flash.display.Sprite.call(this); + this.contentLoaderInfo = flash.display.LoaderInfo.create(this); +}; +$hxClasses["flash.display.Loader"] = flash.display.Loader; +flash.display.Loader.__name__ = ["flash","display","Loader"]; +flash.display.Loader.__super__ = flash.display.Sprite; +flash.display.Loader.prototype = $extend(flash.display.Sprite.prototype,{ + handleLoad: function(e) { + e.currentTarget = this; + this.content.__invalidateBounds(); + this.content.__render(null,null); + this.contentLoaderInfo.removeEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad)); + } + ,validateBounds: function() { + if(this.get__boundsInvalid()) { + flash.display.Sprite.prototype.validateBounds.call(this); + if(this.mImage != null) { + var r = new flash.geom.Rectangle(0,0,this.mImage.get_width(),this.mImage.get_height()); + if(r.width != 0 || r.height != 0) { + if(this.__boundsRect.width == 0 && this.__boundsRect.height == 0) this.__boundsRect = r.clone(); else this.__boundsRect.extendBounds(r); + } } - var rollOver = event.__createSimilar(changeEvents[3],old_obj); - var i1 = new_n - 1; - while(i1 >= common) { - stack[i1].dispatchEvent(rollOver); - i1--; + if(this.scale9Grid != null) { + this.__boundsRect.width *= this.__scaleX; + this.__boundsRect.height *= this.__scaleY; + this.__width = this.__boundsRect.width; + this.__height = this.__boundsRect.height; + } else { + this.__width = this.__boundsRect.width * this.__scaleX; + this.__height = this.__boundsRect.height * this.__scaleY; } - if(touchInfo == null) this.__mouseOverObjects = stack; else touchInfo.touchOverObjects = stack; } } ,toString: function() { - return "[Stage id=" + this.___id + "]"; - } - ,invalidate: function() { - this.__invalid = true; - } - ,__class__: flash.display.Stage - ,__properties__: $extend(flash.display.DisplayObjectContainer.prototype.__properties__,{set_backgroundColor:"set_backgroundColor",get_backgroundColor:"get_backgroundColor",set_color:"set_color",get_color:"get_color",set_displayState:"set_displayState",get_displayState:"get_displayState",set_focus:"set_focus",get_focus:"get_focus",set_frameRate:"set_frameRate",get_frameRate:"get_frameRate",get_fullScreenHeight:"get_fullScreenHeight",get_fullScreenWidth:"get_fullScreenWidth",set_quality:"set_quality",get_quality:"get_quality",set_showDefaultContextMenu:"set_showDefaultContextMenu",get_showDefaultContextMenu:"get_showDefaultContextMenu",get_stageHeight:"get_stageHeight",get_stageWidth:"get_stageWidth"}) -}); -flash.display._Stage = {} -flash.display._Stage.TouchInfo = function() { - this.touchOverObjects = []; -}; -$hxClasses["flash.display._Stage.TouchInfo"] = flash.display._Stage.TouchInfo; -flash.display._Stage.TouchInfo.__name__ = ["flash","display","_Stage","TouchInfo"]; -flash.display._Stage.TouchInfo.prototype = { - __class__: flash.display._Stage.TouchInfo -} -flash.display.StageAlign = $hxClasses["flash.display.StageAlign"] = { __ename__ : true, __constructs__ : ["TOP_RIGHT","TOP_LEFT","TOP","RIGHT","LEFT","BOTTOM_RIGHT","BOTTOM_LEFT","BOTTOM"] } -flash.display.StageAlign.TOP_RIGHT = ["TOP_RIGHT",0]; -flash.display.StageAlign.TOP_RIGHT.toString = $estr; -flash.display.StageAlign.TOP_RIGHT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.TOP_LEFT = ["TOP_LEFT",1]; -flash.display.StageAlign.TOP_LEFT.toString = $estr; -flash.display.StageAlign.TOP_LEFT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.TOP = ["TOP",2]; -flash.display.StageAlign.TOP.toString = $estr; -flash.display.StageAlign.TOP.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.RIGHT = ["RIGHT",3]; -flash.display.StageAlign.RIGHT.toString = $estr; -flash.display.StageAlign.RIGHT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.LEFT = ["LEFT",4]; -flash.display.StageAlign.LEFT.toString = $estr; -flash.display.StageAlign.LEFT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.BOTTOM_RIGHT = ["BOTTOM_RIGHT",5]; -flash.display.StageAlign.BOTTOM_RIGHT.toString = $estr; -flash.display.StageAlign.BOTTOM_RIGHT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.BOTTOM_LEFT = ["BOTTOM_LEFT",6]; -flash.display.StageAlign.BOTTOM_LEFT.toString = $estr; -flash.display.StageAlign.BOTTOM_LEFT.__enum__ = flash.display.StageAlign; -flash.display.StageAlign.BOTTOM = ["BOTTOM",7]; -flash.display.StageAlign.BOTTOM.toString = $estr; -flash.display.StageAlign.BOTTOM.__enum__ = flash.display.StageAlign; -flash.display.StageDisplayState = $hxClasses["flash.display.StageDisplayState"] = { __ename__ : true, __constructs__ : ["NORMAL","FULL_SCREEN","FULL_SCREEN_INTERACTIVE"] } -flash.display.StageDisplayState.NORMAL = ["NORMAL",0]; -flash.display.StageDisplayState.NORMAL.toString = $estr; -flash.display.StageDisplayState.NORMAL.__enum__ = flash.display.StageDisplayState; -flash.display.StageDisplayState.FULL_SCREEN = ["FULL_SCREEN",1]; -flash.display.StageDisplayState.FULL_SCREEN.toString = $estr; -flash.display.StageDisplayState.FULL_SCREEN.__enum__ = flash.display.StageDisplayState; -flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE = ["FULL_SCREEN_INTERACTIVE",2]; -flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE.toString = $estr; -flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE.__enum__ = flash.display.StageDisplayState; -flash.display.StageQuality = function() { } -$hxClasses["flash.display.StageQuality"] = flash.display.StageQuality; -flash.display.StageQuality.__name__ = ["flash","display","StageQuality"]; -flash.display.StageScaleMode = $hxClasses["flash.display.StageScaleMode"] = { __ename__ : true, __constructs__ : ["SHOW_ALL","NO_SCALE","NO_BORDER","EXACT_FIT"] } -flash.display.StageScaleMode.SHOW_ALL = ["SHOW_ALL",0]; -flash.display.StageScaleMode.SHOW_ALL.toString = $estr; -flash.display.StageScaleMode.SHOW_ALL.__enum__ = flash.display.StageScaleMode; -flash.display.StageScaleMode.NO_SCALE = ["NO_SCALE",1]; -flash.display.StageScaleMode.NO_SCALE.toString = $estr; -flash.display.StageScaleMode.NO_SCALE.__enum__ = flash.display.StageScaleMode; -flash.display.StageScaleMode.NO_BORDER = ["NO_BORDER",2]; -flash.display.StageScaleMode.NO_BORDER.toString = $estr; -flash.display.StageScaleMode.NO_BORDER.__enum__ = flash.display.StageScaleMode; -flash.display.StageScaleMode.EXACT_FIT = ["EXACT_FIT",3]; -flash.display.StageScaleMode.EXACT_FIT.toString = $estr; -flash.display.StageScaleMode.EXACT_FIT.__enum__ = flash.display.StageScaleMode; -flash.errors = {} -flash.errors.Error = function(message,id) { - if(id == null) id = 0; - if(message == null) message = ""; - this.message = message; - this.errorID = id; -}; -$hxClasses["flash.errors.Error"] = flash.errors.Error; -flash.errors.Error.__name__ = ["flash","errors","Error"]; -flash.errors.Error.prototype = { - toString: function() { - if(this.message != null) return this.message; else return "Error"; + return "[Loader name=" + this.name + " id=" + this.___id + "]"; } - ,getStackTrace: function() { - return haxe.CallStack.toString(haxe.CallStack.exceptionStack()); + ,loadBytes: function(buffer) { + var _g = this; + try { + this.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad),false,2147483647); + flash.display.BitmapData.loadFromBytes(buffer,null,function(bmd) { + _g.content = new flash.display.Bitmap(bmd); + _g.contentLoaderInfo.content = _g.content; + _g.addChild(_g.content); + var evt = new flash.events.Event(flash.events.Event.COMPLETE); + evt.currentTarget = _g; + _g.contentLoaderInfo.dispatchEvent(evt); + }); + } catch( e ) { + console.log("Error " + Std.string(e)); + var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); + evt.currentTarget = this; + this.contentLoaderInfo.dispatchEvent(evt); + } } - ,__class__: flash.errors.Error -} -flash.errors.IOError = function(message) { - if(message == null) message = ""; - flash.errors.Error.call(this,message); -}; -$hxClasses["flash.errors.IOError"] = flash.errors.IOError; -flash.errors.IOError.__name__ = ["flash","errors","IOError"]; -flash.errors.IOError.__super__ = flash.errors.Error; -flash.errors.IOError.prototype = $extend(flash.errors.Error.prototype,{ - __class__: flash.errors.IOError -}); -flash.events.TextEvent = function(type,bubbles,cancelable,text) { - if(text == null) text = ""; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.Event.call(this,type,bubbles,cancelable); - this.text = text; -}; -$hxClasses["flash.events.TextEvent"] = flash.events.TextEvent; -flash.events.TextEvent.__name__ = ["flash","events","TextEvent"]; -flash.events.TextEvent.__super__ = flash.events.Event; -flash.events.TextEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.TextEvent + ,load: function(request,context) { + var extension = ""; + var parts = request.url.split("."); + if(parts.length > 0) extension = parts[parts.length - 1].toLowerCase(); + var transparent = true; + this.contentLoaderInfo.url = request.url; + if(request.contentType == null && request.contentType != "") this.contentLoaderInfo.contentType = (function($this) { + var $r; + switch(extension) { + case "swf": + $r = "application/x-shockwave-flash"; + break; + case "jpg":case "jpeg": + $r = (function($this) { + var $r; + transparent = false; + $r = "image/jpeg"; + return $r; + }($this)); + break; + case "png": + $r = "image/png"; + break; + case "gif": + $r = "image/gif"; + break; + default: + $r = "application/x-www-form-urlencoded"; + } + return $r; + }(this)); else this.contentLoaderInfo.contentType = request.contentType; + this.mImage = new flash.display.BitmapData(0,0,transparent); + try { + this.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.handleLoad),false,2147483647); + this.mImage.__loadFromFile(request.url,this.contentLoaderInfo); + this.content = new flash.display.Bitmap(this.mImage); + this.contentLoaderInfo.content = this.content; + this.addChild(this.content); + } catch( e ) { + console.log("Error " + Std.string(e)); + var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); + evt.currentTarget = this; + this.contentLoaderInfo.dispatchEvent(evt); + return; + } + if(this.mShape == null) { + this.mShape = new flash.display.Shape(); + this.addChild(this.mShape); + } + } + ,__class__: flash.display.Loader }); -flash.events.ErrorEvent = function(type,bubbles,cancelable,text,id) { - if(id == null) id = 0; - flash.events.TextEvent.call(this,type,bubbles,cancelable); - this.text = text; - this.errorID = id; +flash.display.LoaderInfo = function() { + flash.events.EventDispatcher.call(this); + this.applicationDomain = flash.system.ApplicationDomain.currentDomain; + this.bytesLoaded = 0; + this.bytesTotal = 0; + this.childAllowsParent = true; + this.parameters = { }; }; -$hxClasses["flash.events.ErrorEvent"] = flash.events.ErrorEvent; -flash.events.ErrorEvent.__name__ = ["flash","events","ErrorEvent"]; -flash.events.ErrorEvent.__super__ = flash.events.TextEvent; -flash.events.ErrorEvent.prototype = $extend(flash.events.TextEvent.prototype,{ - __class__: flash.events.ErrorEvent +$hxClasses["flash.display.LoaderInfo"] = flash.display.LoaderInfo; +flash.display.LoaderInfo.__name__ = ["flash","display","LoaderInfo"]; +flash.display.LoaderInfo.create = function(ldr) { + var li = new flash.display.LoaderInfo(); + if(ldr != null) li.loader = ldr; else li.url = ""; + return li; +} +flash.display.LoaderInfo.__super__ = flash.events.EventDispatcher; +flash.display.LoaderInfo.prototype = $extend(flash.events.EventDispatcher.prototype,{ + __class__: flash.display.LoaderInfo }); -flash.events.Listener = function(inListener,inUseCapture,inPriority) { - this.mListner = inListener; - this.mUseCapture = inUseCapture; - this.mPriority = inPriority; - this.mID = flash.events.Listener.sIDs++; +flash.display.MovieClip = function() { + flash.display.Sprite.call(this); + this.enabled = true; + this.__currentFrame = 0; + this.__totalFrames = 0; + this.loaderInfo = flash.display.LoaderInfo.create(null); }; -$hxClasses["flash.events.Listener"] = flash.events.Listener; -flash.events.Listener.__name__ = ["flash","events","Listener"]; -flash.events.Listener.prototype = { - Is: function(inListener,inCapture) { - return Reflect.compareMethods(this.mListner,inListener) && this.mUseCapture == inCapture; +$hxClasses["flash.display.MovieClip"] = flash.display.MovieClip; +flash.display.MovieClip.__name__ = ["flash","display","MovieClip"]; +flash.display.MovieClip.__super__ = flash.display.Sprite; +flash.display.MovieClip.prototype = $extend(flash.display.Sprite.prototype,{ + get_totalFrames: function() { + return this.__totalFrames; } - ,dispatchEvent: function(event) { - this.mListner(event); + ,get_framesLoaded: function() { + return this.__totalFrames; } - ,__class__: flash.events.Listener -} -flash.events.EventPhase = function() { } -$hxClasses["flash.events.EventPhase"] = flash.events.EventPhase; -flash.events.EventPhase.__name__ = ["flash","events","EventPhase"]; -flash.events.FocusEvent = function(type,bubbles,cancelable,inObject,inShiftKey,inKeyCode) { - if(inKeyCode == null) inKeyCode = 0; - if(inShiftKey == null) inShiftKey = false; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.Event.call(this,type,bubbles,cancelable); - this.keyCode = inKeyCode; - this.shiftKey = inShiftKey == null?false:inShiftKey; - this.target = inObject; -}; -$hxClasses["flash.events.FocusEvent"] = flash.events.FocusEvent; -flash.events.FocusEvent.__name__ = ["flash","events","FocusEvent"]; -flash.events.FocusEvent.__super__ = flash.events.Event; -flash.events.FocusEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.FocusEvent -}); -flash.events.HTTPStatusEvent = function(type,bubbles,cancelable,status) { - if(status == null) status = 0; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - this.status = status; - flash.events.Event.call(this,type,bubbles,cancelable); -}; -$hxClasses["flash.events.HTTPStatusEvent"] = flash.events.HTTPStatusEvent; -flash.events.HTTPStatusEvent.__name__ = ["flash","events","HTTPStatusEvent"]; -flash.events.HTTPStatusEvent.__super__ = flash.events.Event; -flash.events.HTTPStatusEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.HTTPStatusEvent -}); -flash.events.IOErrorEvent = function(type,bubbles,cancelable,inText) { - if(inText == null) inText = ""; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.Event.call(this,type,bubbles,cancelable); - this.text = inText; -}; -$hxClasses["flash.events.IOErrorEvent"] = flash.events.IOErrorEvent; -flash.events.IOErrorEvent.__name__ = ["flash","events","IOErrorEvent"]; -flash.events.IOErrorEvent.__super__ = flash.events.Event; -flash.events.IOErrorEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.IOErrorEvent -}); -flash.events.KeyboardEvent = function(type,bubbles,cancelable,inCharCode,inKeyCode,inKeyLocation,inCtrlKey,inAltKey,inShiftKey,controlKeyValue,commandKeyValue) { - if(commandKeyValue == null) commandKeyValue = false; - if(controlKeyValue == null) controlKeyValue = false; - if(inShiftKey == null) inShiftKey = false; - if(inAltKey == null) inAltKey = false; - if(inCtrlKey == null) inCtrlKey = false; - if(inKeyLocation == null) inKeyLocation = 0; - if(inKeyCode == null) inKeyCode = 0; - if(inCharCode == null) inCharCode = 0; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.Event.call(this,type,bubbles,cancelable); - this.altKey = inAltKey == null?false:inAltKey; - this.charCode = inCharCode == null?0:inCharCode; - this.ctrlKey = inCtrlKey == null?false:inCtrlKey; - this.commandKey = commandKeyValue; - this.controlKey = controlKeyValue; - this.keyCode = inKeyCode; - this.keyLocation = inKeyLocation == null?0:inKeyLocation; - this.shiftKey = inShiftKey == null?false:inShiftKey; -}; -$hxClasses["flash.events.KeyboardEvent"] = flash.events.KeyboardEvent; -flash.events.KeyboardEvent.__name__ = ["flash","events","KeyboardEvent"]; -flash.events.KeyboardEvent.__super__ = flash.events.Event; -flash.events.KeyboardEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.KeyboardEvent + ,get_currentFrame: function() { + return this.__currentFrame; + } + ,toString: function() { + return "[MovieClip name=" + this.name + " id=" + this.___id + "]"; + } + ,stop: function() { + } + ,prevFrame: function() { + } + ,play: function() { + } + ,nextFrame: function() { + } + ,gotoAndStop: function(frame,scene) { + if(scene == null) scene = ""; + } + ,gotoAndPlay: function(frame,scene) { + if(scene == null) scene = ""; + } + ,__class__: flash.display.MovieClip + ,__properties__: $extend(flash.display.Sprite.prototype.__properties__,{get_currentFrame:"get_currentFrame",get_framesLoaded:"get_framesLoaded",get_totalFrames:"get_totalFrames"}) }); -flash.events.ProgressEvent = function(type,bubbles,cancelable,bytesLoaded,bytesTotal) { - if(bytesTotal == null) bytesTotal = 0; - if(bytesLoaded == null) bytesLoaded = 0; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.Event.call(this,type,bubbles,cancelable); - this.bytesLoaded = bytesLoaded; - this.bytesTotal = bytesTotal; +flash.display.PixelSnapping = $hxClasses["flash.display.PixelSnapping"] = { __ename__ : true, __constructs__ : ["NEVER","AUTO","ALWAYS"] } +flash.display.PixelSnapping.NEVER = ["NEVER",0]; +flash.display.PixelSnapping.NEVER.toString = $estr; +flash.display.PixelSnapping.NEVER.__enum__ = flash.display.PixelSnapping; +flash.display.PixelSnapping.AUTO = ["AUTO",1]; +flash.display.PixelSnapping.AUTO.toString = $estr; +flash.display.PixelSnapping.AUTO.__enum__ = flash.display.PixelSnapping; +flash.display.PixelSnapping.ALWAYS = ["ALWAYS",2]; +flash.display.PixelSnapping.ALWAYS.toString = $estr; +flash.display.PixelSnapping.ALWAYS.__enum__ = flash.display.PixelSnapping; +flash.display.Shape = function() { + flash.display.DisplayObject.call(this); + this.__graphics = new flash.display.Graphics(); }; -$hxClasses["flash.events.ProgressEvent"] = flash.events.ProgressEvent; -flash.events.ProgressEvent.__name__ = ["flash","events","ProgressEvent"]; -flash.events.ProgressEvent.__super__ = flash.events.Event; -flash.events.ProgressEvent.prototype = $extend(flash.events.Event.prototype,{ - __class__: flash.events.ProgressEvent +$hxClasses["flash.display.Shape"] = flash.display.Shape; +flash.display.Shape.__name__ = ["flash","display","Shape"]; +flash.display.Shape.__super__ = flash.display.DisplayObject; +flash.display.Shape.prototype = $extend(flash.display.DisplayObject.prototype,{ + get_graphics: function() { + return this.__graphics; + } + ,__getObjectUnderPoint: function(point) { + if(this.parent == null) return null; + if(this.parent.mouseEnabled && flash.display.DisplayObject.prototype.__getObjectUnderPoint.call(this,point) == this) return this.parent; else return null; + } + ,__getGraphics: function() { + return this.__graphics; + } + ,toString: function() { + return "[Shape name=" + this.name + " id=" + this.___id + "]"; + } + ,__class__: flash.display.Shape + ,__properties__: $extend(flash.display.DisplayObject.prototype.__properties__,{get_graphics:"get_graphics"}) }); -flash.events.SecurityErrorEvent = function(type,bubbles,cancelable,text) { - if(text == null) text = ""; - if(cancelable == null) cancelable = false; - if(bubbles == null) bubbles = false; - flash.events.ErrorEvent.call(this,type,bubbles,cancelable); - this.text = text; +flash.display.SpreadMethod = $hxClasses["flash.display.SpreadMethod"] = { __ename__ : true, __constructs__ : ["REPEAT","REFLECT","PAD"] } +flash.display.SpreadMethod.REPEAT = ["REPEAT",0]; +flash.display.SpreadMethod.REPEAT.toString = $estr; +flash.display.SpreadMethod.REPEAT.__enum__ = flash.display.SpreadMethod; +flash.display.SpreadMethod.REFLECT = ["REFLECT",1]; +flash.display.SpreadMethod.REFLECT.toString = $estr; +flash.display.SpreadMethod.REFLECT.__enum__ = flash.display.SpreadMethod; +flash.display.SpreadMethod.PAD = ["PAD",2]; +flash.display.SpreadMethod.PAD.toString = $estr; +flash.display.SpreadMethod.PAD.__enum__ = flash.display.SpreadMethod; +flash.events.Event = function(inType,inBubbles,inCancelable) { + if(inCancelable == null) inCancelable = false; + if(inBubbles == null) inBubbles = false; + this.type = inType; + this.bubbles = inBubbles; + this.cancelable = inCancelable; + this.__isCancelled = false; + this.__isCancelledNow = false; + this.target = null; + this.currentTarget = null; + this.eventPhase = flash.events.EventPhase.AT_TARGET; }; -$hxClasses["flash.events.SecurityErrorEvent"] = flash.events.SecurityErrorEvent; -flash.events.SecurityErrorEvent.__name__ = ["flash","events","SecurityErrorEvent"]; -flash.events.SecurityErrorEvent.__super__ = flash.events.ErrorEvent; -flash.events.SecurityErrorEvent.prototype = $extend(flash.events.ErrorEvent.prototype,{ - __class__: flash.events.SecurityErrorEvent -}); -flash.events.TouchEvent = function(type,bubbles,cancelable,localX,localY,relatedObject,ctrlKey,altKey,shiftKey,buttonDown,delta,commandKey,clickCount) { +$hxClasses["flash.events.Event"] = flash.events.Event; +flash.events.Event.__name__ = ["flash","events","Event"]; +flash.events.Event.prototype = { + __setPhase: function(phase) { + this.eventPhase = phase; + } + ,__getIsCancelledNow: function() { + return this.__isCancelledNow; + } + ,__getIsCancelled: function() { + return this.__isCancelled; + } + ,__createSimilar: function(type,related,targ) { + var result = new flash.events.Event(type,this.bubbles,this.cancelable); + if(targ != null) result.target = targ; + return result; + } + ,toString: function() { + return "[Event type=" + this.type + " bubbles=" + Std.string(this.bubbles) + " cancelable=" + Std.string(this.cancelable) + "]"; + } + ,stopPropagation: function() { + this.__isCancelled = true; + } + ,stopImmediatePropagation: function() { + this.__isCancelled = true; + this.__isCancelledNow = true; + } + ,clone: function() { + return new flash.events.Event(this.type,this.bubbles,this.cancelable); + } + ,__class__: flash.events.Event +} +flash.events.MouseEvent = function(type,bubbles,cancelable,localX,localY,relatedObject,ctrlKey,altKey,shiftKey,buttonDown,delta,commandKey,clickCount) { if(clickCount == null) clickCount = 0; if(commandKey == null) commandKey = false; if(delta == null) delta = 0; @@ -7994,2149 +7688,2350 @@ flash.events.TouchEvent = function(type,bubbles,cancelable,localX,localY,related this.localY = localY; this.buttonDown = buttonDown; this.commandKey = commandKey; - this.touchPointID = 0; - this.isPrimaryTouchPoint = true; -}; -$hxClasses["flash.events.TouchEvent"] = flash.events.TouchEvent; -flash.events.TouchEvent.__name__ = ["flash","events","TouchEvent"]; -flash.events.TouchEvent.__create = function(type,event,touch,local,target) { - var evt = new flash.events.TouchEvent(type,true,false,local.x,local.y,null,event.ctrlKey,event.altKey,event.shiftKey,false,0,null,0); - evt.stageX = flash.Lib.get_current().get_stage().get_mouseX(); - evt.stageY = flash.Lib.get_current().get_stage().get_mouseY(); - evt.target = target; - return evt; -} -flash.events.TouchEvent.__super__ = flash.events.Event; -flash.events.TouchEvent.prototype = $extend(flash.events.Event.prototype,{ - __createSimilar: function(type,related,targ) { - var result = new flash.events.TouchEvent(type,this.bubbles,this.cancelable,this.localX,this.localY,related == null?this.relatedObject:related,this.ctrlKey,this.altKey,this.shiftKey,this.buttonDown,this.delta,this.commandKey); - result.touchPointID = this.touchPointID; - result.isPrimaryTouchPoint = this.isPrimaryTouchPoint; - if(targ != null) result.target = targ; - return result; - } - ,__class__: flash.events.TouchEvent -}); -flash.filters = {} -flash.filters.BitmapFilter = function(inType) { - this._mType = inType; -}; -$hxClasses["flash.filters.BitmapFilter"] = flash.filters.BitmapFilter; -flash.filters.BitmapFilter.__name__ = ["flash","filters","BitmapFilter"]; -flash.filters.BitmapFilter.prototype = { - __applyFilter: function(surface,rect,refreshCache) { - if(refreshCache == null) refreshCache = false; - } - ,__preFilter: function(surface) { - } - ,clone: function() { - return new flash.filters.BitmapFilter(this._mType); - } - ,__class__: flash.filters.BitmapFilter -} -flash.filters.DropShadowFilter = function(in_distance,in_angle,in_color,in_alpha,in_blurX,in_blurY,in_strength,in_quality,in_inner,in_knockout,in_hideObject) { - if(in_hideObject == null) in_hideObject = false; - if(in_knockout == null) in_knockout = false; - if(in_inner == null) in_inner = false; - if(in_quality == null) in_quality = 1; - if(in_strength == null) in_strength = 1.0; - if(in_blurY == null) in_blurY = 4.0; - if(in_blurX == null) in_blurX = 4.0; - if(in_alpha == null) in_alpha = 1.0; - if(in_color == null) in_color = 0; - if(in_angle == null) in_angle = 45.0; - if(in_distance == null) in_distance = 4.0; - flash.filters.BitmapFilter.call(this,"DropShadowFilter"); - this.distance = in_distance; - this.angle = in_angle; - this.color = in_color; - this.alpha = in_alpha; - this.blurX = in_blurX; - this.blurY = in_blurX; - this.strength = in_strength; - this.quality = in_quality; - this.inner = in_inner; - this.knockout = in_knockout; - this.hideObject = in_hideObject; - this.___cached = false; -}; -$hxClasses["flash.filters.DropShadowFilter"] = flash.filters.DropShadowFilter; -flash.filters.DropShadowFilter.__name__ = ["flash","filters","DropShadowFilter"]; -flash.filters.DropShadowFilter.__super__ = flash.filters.BitmapFilter; -flash.filters.DropShadowFilter.prototype = $extend(flash.filters.BitmapFilter.prototype,{ - __applyFilter: function(surface,rect,refreshCache) { - if(refreshCache == null) refreshCache = false; - if(!this.___cached || refreshCache) { - var distanceX = this.distance * Math.sin(2 * Math.PI * this.angle / 360.0); - var distanceY = this.distance * Math.cos(2 * Math.PI * this.angle / 360.0); - var blurRadius = Math.max(this.blurX,this.blurY); - var context = surface.getContext("2d"); - context.shadowOffsetX = distanceX; - context.shadowOffsetY = distanceY; - context.shadowBlur = blurRadius; - context.shadowColor = "rgba(" + (this.color >> 16 & 255) + "," + (this.color >> 8 & 255) + "," + (this.color & 255) + "," + this.alpha + ")"; - this.___cached = true; - } - } - ,clone: function() { - return new flash.filters.DropShadowFilter(this.distance,this.angle,this.color,this.alpha,this.blurX,this.blurY,this.strength,this.quality,this.inner,this.knockout,this.hideObject); - } - ,__class__: flash.filters.DropShadowFilter -}); -flash.geom = {} -flash.geom.ColorTransform = function(inRedMultiplier,inGreenMultiplier,inBlueMultiplier,inAlphaMultiplier,inRedOffset,inGreenOffset,inBlueOffset,inAlphaOffset) { - if(inAlphaOffset == null) inAlphaOffset = 0; - if(inBlueOffset == null) inBlueOffset = 0; - if(inGreenOffset == null) inGreenOffset = 0; - if(inRedOffset == null) inRedOffset = 0; - if(inAlphaMultiplier == null) inAlphaMultiplier = 1; - if(inBlueMultiplier == null) inBlueMultiplier = 1; - if(inGreenMultiplier == null) inGreenMultiplier = 1; - if(inRedMultiplier == null) inRedMultiplier = 1; - this.redMultiplier = inRedMultiplier == null?1.0:inRedMultiplier; - this.greenMultiplier = inGreenMultiplier == null?1.0:inGreenMultiplier; - this.blueMultiplier = inBlueMultiplier == null?1.0:inBlueMultiplier; - this.alphaMultiplier = inAlphaMultiplier == null?1.0:inAlphaMultiplier; - this.redOffset = inRedOffset == null?0.0:inRedOffset; - this.greenOffset = inGreenOffset == null?0.0:inGreenOffset; - this.blueOffset = inBlueOffset == null?0.0:inBlueOffset; - this.alphaOffset = inAlphaOffset == null?0.0:inAlphaOffset; -}; -$hxClasses["flash.geom.ColorTransform"] = flash.geom.ColorTransform; -flash.geom.ColorTransform.__name__ = ["flash","geom","ColorTransform"]; -flash.geom.ColorTransform.prototype = { - set_color: function(value) { - this.redOffset = value >> 16 & 255; - this.greenOffset = value >> 8 & 255; - this.blueOffset = value & 255; - this.redMultiplier = 0; - this.greenMultiplier = 0; - this.blueMultiplier = 0; - return this.get_color(); - } - ,get_color: function() { - return (this.redOffset | 0) << 16 | (this.greenOffset | 0) << 8 | (this.blueOffset | 0); - } - ,concat: function(second) { - this.redMultiplier += second.redMultiplier; - this.greenMultiplier += second.greenMultiplier; - this.blueMultiplier += second.blueMultiplier; - this.alphaMultiplier += second.alphaMultiplier; - } - ,__class__: flash.geom.ColorTransform - ,__properties__: {set_color:"set_color",get_color:"get_color"} -} -flash.geom.Matrix = function(in_a,in_b,in_c,in_d,in_tx,in_ty) { - if(in_ty == null) in_ty = 0; - if(in_tx == null) in_tx = 0; - if(in_d == null) in_d = 1; - if(in_c == null) in_c = 0; - if(in_b == null) in_b = 0; - if(in_a == null) in_a = 1; - this.a = in_a; - this.b = in_b; - this.c = in_c; - this.d = in_d; - this.set_tx(in_tx); - this.set_ty(in_ty); - this._sx = 1.0; - this._sy = 1.0; + this.clickCount = clickCount; }; -$hxClasses["flash.geom.Matrix"] = flash.geom.Matrix; -flash.geom.Matrix.__name__ = ["flash","geom","Matrix"]; -flash.geom.Matrix.prototype = { - set_ty: function(inValue) { - this.ty = inValue; - return this.ty; - } - ,set_tx: function(inValue) { - this.tx = inValue; - return this.tx; - } - ,__translateTransformed: function(inPos) { - this.set_tx(inPos.x * this.a + inPos.y * this.c + this.tx); - this.set_ty(inPos.x * this.b + inPos.y * this.d + this.ty); - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); - } - ,__transformY: function(inPos) { - return inPos.x * this.b + inPos.y * this.d + this.ty; - } - ,__transformX: function(inPos) { - return inPos.x * this.a + inPos.y * this.c + this.tx; - } - ,translate: function(inDX,inDY) { - var m = new flash.geom.Matrix(); - m.set_tx(inDX); - m.set_ty(inDY); - this.concat(m); - } - ,transformPoint: function(inPos) { - return new flash.geom.Point(inPos.x * this.a + inPos.y * this.c + this.tx,inPos.x * this.b + inPos.y * this.d + this.ty); - } - ,toString: function() { - return "matrix(" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.tx + ", " + this.ty + ")"; - } - ,toMozString: function() { - return "matrix(" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.tx + "px, " + this.ty + "px)"; - } - ,to3DString: function() { - return "matrix3d(" + this.a + ", " + this.b + ", " + "0, 0, " + this.c + ", " + this.d + ", " + "0, 0, 0, 0, 1, 0, " + this.tx + ", " + this.ty + ", " + "0, 1" + ")"; - } - ,setRotation: function(inTheta,inScale) { - if(inScale == null) inScale = 1; - var scale = inScale; - this.a = Math.cos(inTheta) * scale; - this.c = Math.sin(inTheta) * scale; - this.b = -this.c; - this.d = this.a; - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); - } - ,scale: function(inSX,inSY) { - this._sx = inSX; - this._sy = inSY; - this.a *= inSX; - this.b *= inSY; - this.c *= inSX; - this.d *= inSY; - var _g = this; - _g.set_tx(_g.tx * inSX); - var _g = this; - _g.set_ty(_g.ty * inSY); - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); +$hxClasses["flash.events.MouseEvent"] = flash.events.MouseEvent; +flash.events.MouseEvent.__name__ = ["flash","events","MouseEvent"]; +flash.events.MouseEvent.__create = function(type,event,local,target) { + var __mouseDown = false; + var delta = 2; + if(type == flash.events.MouseEvent.MOUSE_WHEEL) { + var mouseEvent = event; + if(mouseEvent.wheelDelta) delta = mouseEvent.wheelDelta / 120 | 0; else if(mouseEvent.detail) -mouseEvent.detail | 0; } - ,rotate: function(inTheta) { - var cos = Math.cos(inTheta); - var sin = Math.sin(inTheta); - var a1 = this.a * cos - this.b * sin; - this.b = this.a * sin + this.b * cos; - this.a = a1; - var c1 = this.c * cos - this.d * sin; - this.d = this.c * sin + this.d * cos; - this.c = c1; - var tx1 = this.tx * cos - this.ty * sin; - this.set_ty(this.tx * sin + this.ty * cos); - this.set_tx(tx1); - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); + if(type == flash.events.MouseEvent.MOUSE_DOWN) __mouseDown = event.which != null?event.which == 1:event.button != null?event.button == 0:false; else if(type == flash.events.MouseEvent.MOUSE_UP) { + if(event.which != null) { + if(event.which == 1) __mouseDown = false; else if(event.button != null) { + if(event.button == 0) __mouseDown = false; else __mouseDown = false; + } + } } - ,mult: function(m) { - var result = this.clone(); - result.concat(m); + var pseudoEvent = new flash.events.MouseEvent(type,true,false,local.x,local.y,null,event.ctrlKey,event.altKey,event.shiftKey,__mouseDown,delta); + pseudoEvent.stageX = flash.Lib.get_current().get_stage().get_mouseX(); + pseudoEvent.stageY = flash.Lib.get_current().get_stage().get_mouseY(); + pseudoEvent.target = target; + return pseudoEvent; +} +flash.events.MouseEvent.__super__ = flash.events.Event; +flash.events.MouseEvent.prototype = $extend(flash.events.Event.prototype,{ + updateAfterEvent: function() { + } + ,__createSimilar: function(type,related,targ) { + var result = new flash.events.MouseEvent(type,this.bubbles,this.cancelable,this.localX,this.localY,related == null?this.relatedObject:related,this.ctrlKey,this.altKey,this.shiftKey,this.buttonDown,this.delta,this.commandKey,this.clickCount); + if(targ != null) result.target = targ; return result; } - ,invert: function() { - var norm = this.a * this.d - this.b * this.c; - if(norm == 0) { - this.a = this.b = this.c = this.d = 0; - this.set_tx(-this.tx); - this.set_ty(-this.ty); - } else { - norm = 1.0 / norm; - var a1 = this.d * norm; - this.d = this.a * norm; - this.a = a1; - this.b *= -norm; - this.c *= -norm; - var tx1 = -this.a * this.tx - this.c * this.ty; - this.set_ty(-this.b * this.tx - this.d * this.ty); - this.set_tx(tx1); - } - this._sx /= this._sx; - this._sy /= this._sy; - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); - return this; + ,__class__: flash.events.MouseEvent +}); +flash.display.Stage = function(width,height) { + flash.display.DisplayObjectContainer.call(this); + this.__focusObject = null; + this.__focusObjectActivated = false; + this.__windowWidth = width; + this.__windowHeight = height; + this.stageFocusRect = false; + this.scaleMode = flash.display.StageScaleMode.SHOW_ALL; + this.__stageMatrix = new flash.geom.Matrix(); + this.tabEnabled = true; + this.set_frameRate(0.0); + this.set_backgroundColor(16777215); + this.name = "Stage"; + this.loaderInfo = flash.display.LoaderInfo.create(null); + this.loaderInfo.parameters.width = Std.string(this.__windowWidth); + this.loaderInfo.parameters.height = Std.string(this.__windowHeight); + this.__pointInPathMode = flash.display.Graphics.__detectIsPointInPathMode(); + this.__mouseOverObjects = []; + this.set_showDefaultContextMenu(true); + this.__touchInfo = []; + this.__uIEventsQueue = new Array(1000); + this.__uIEventsQueueIndex = 0; +}; +$hxClasses["flash.display.Stage"] = flash.display.Stage; +flash.display.Stage.__name__ = ["flash","display","Stage"]; +flash.display.Stage.getOrientation = function() { + var rotation = window.orientation; + var orientation = flash.display.Stage.OrientationPortrait; + switch(rotation) { + case -90: + orientation = flash.display.Stage.OrientationLandscapeLeft; + break; + case 180: + orientation = flash.display.Stage.OrientationPortraitUpsideDown; + break; + case 90: + orientation = flash.display.Stage.OrientationLandscapeRight; + break; + default: + orientation = flash.display.Stage.OrientationPortrait; } - ,identity: function() { - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 1; - this.set_tx(0); - this.set_ty(0); - this._sx = 1.0; - this._sy = 1.0; + return orientation; +} +flash.display.Stage.__super__ = flash.display.DisplayObjectContainer; +flash.display.Stage.prototype = $extend(flash.display.DisplayObjectContainer.prototype,{ + get_stageWidth: function() { + return this.__windowWidth; } - ,createGradientBox: function(in_width,in_height,rotation,in_tx,in_ty) { - if(in_ty == null) in_ty = 0; - if(in_tx == null) in_tx = 0; - if(rotation == null) rotation = 0; - this.a = in_width / 1638.4; - this.d = in_height / 1638.4; - if(rotation != null && rotation != 0.0) { - var cos = Math.cos(rotation); - var sin = Math.sin(rotation); - this.b = sin * this.d; - this.c = -sin * this.a; - this.a *= cos; - this.d *= cos; - } else { - this.b = 0; - this.c = 0; - } - this.set_tx(in_tx != null?in_tx + in_width / 2:in_width / 2); - this.set_ty(in_ty != null?in_ty + in_height / 2:in_height / 2); + ,get_stageHeight: function() { + return this.__windowHeight; } - ,copy: function(m) { - this.a = m.a; - this.b = m.b; - this.c = m.c; - this.d = m.d; - this.set_tx(m.tx); - this.set_ty(m.ty); - this._sx = m._sx; - this._sy = m._sy; + ,get_stage: function() { + return flash.Lib.__getStage(); } - ,concat: function(m) { - var a1 = this.a * m.a + this.b * m.c; - this.b = this.a * m.b + this.b * m.d; - this.a = a1; - var c1 = this.c * m.a + this.d * m.c; - this.d = this.c * m.b + this.d * m.d; - this.c = c1; - var tx1 = this.tx * m.a + this.ty * m.c + m.tx; - this.set_ty(this.tx * m.b + this.ty * m.d + m.ty); - this.set_tx(tx1); - this._sx *= m._sx; - this._sy *= m._sy; - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); + ,set_showDefaultContextMenu: function(showDefaultContextMenu) { + if(showDefaultContextMenu != this.__showDefaultContextMenu && this.__showDefaultContextMenu != null) { + if(!showDefaultContextMenu) flash.Lib.__disableRightClick(); else flash.Lib.__enableRightClick(); + } + this.__showDefaultContextMenu = showDefaultContextMenu; + return showDefaultContextMenu; } - ,clone: function() { - var m = new flash.geom.Matrix(this.a,this.b,this.c,this.d,this.tx,this.ty); - m._sx = this._sx; - m._sy = this._sy; - return m; + ,get_showDefaultContextMenu: function() { + return this.__showDefaultContextMenu; } - ,cleanValues: function() { - this.a = Math.round(this.a * 1000) / 1000; - this.b = Math.round(this.b * 1000) / 1000; - this.c = Math.round(this.c * 1000) / 1000; - this.d = Math.round(this.d * 1000) / 1000; - this.set_tx(Math.round(this.tx * 10) / 10); - this.set_ty(Math.round(this.ty * 10) / 10); + ,set_quality: function(inQuality) { + return this.quality = inQuality; } - ,__class__: flash.geom.Matrix - ,__properties__: {set_tx:"set_tx",set_ty:"set_ty"} -} -flash.geom.Matrix3D = function(v) { - if(v != null && flash._Vector.Vector_Impl_.get_length(v) == 16) this.rawData = v; else this.rawData = [1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0]; -}; -$hxClasses["flash.geom.Matrix3D"] = flash.geom.Matrix3D; -flash.geom.Matrix3D.__name__ = ["flash","geom","Matrix3D"]; -flash.geom.Matrix3D.create2D = function(x,y,scale,rotation) { - if(rotation == null) rotation = 0; - if(scale == null) scale = 1; - var theta = rotation * Math.PI / 180.0; - var c = Math.cos(theta); - var s = Math.sin(theta); - return new flash.geom.Matrix3D([c * scale,-s * scale,0,0,s * scale,c * scale,0,0,0,0,1,0,x,y,0,1]); -} -flash.geom.Matrix3D.createABCD = function(a,b,c,d,tx,ty) { - return new flash.geom.Matrix3D([a,b,0,0,c,d,0,0,0,0,1,0,tx,ty,0,1]); -} -flash.geom.Matrix3D.createOrtho = function(x0,x1,y0,y1,zNear,zFar) { - var sx = 1.0 / (x1 - x0); - var sy = 1.0 / (y1 - y0); - var sz = 1.0 / (zFar - zNear); - return new flash.geom.Matrix3D([2.0 * sx,0,0,0,0,2.0 * sy,0,0,0,0,-2. * sz,0,-(x0 + x1) * sx,-(y0 + y1) * sy,-(zNear + zFar) * sz,1]); -} -flash.geom.Matrix3D.getAxisRotation = function(x,y,z,degrees) { - var m = new flash.geom.Matrix3D(); - var a1 = new flash.geom.Vector3D(x,y,z); - var rad = -degrees * (Math.PI / 180); - var c = Math.cos(rad); - var s = Math.sin(rad); - var t = 1.0 - c; - m.rawData[0] = c + a1.x * a1.x * t; - m.rawData[5] = c + a1.y * a1.y * t; - m.rawData[10] = c + a1.z * a1.z * t; - var tmp1 = a1.x * a1.y * t; - var tmp2 = a1.z * s; - m.rawData[4] = tmp1 + tmp2; - m.rawData[1] = tmp1 - tmp2; - tmp1 = a1.x * a1.z * t; - tmp2 = a1.y * s; - m.rawData[8] = tmp1 - tmp2; - m.rawData[2] = tmp1 + tmp2; - tmp1 = a1.y * a1.z * t; - tmp2 = a1.x * s; - m.rawData[9] = tmp1 + tmp2; - m.rawData[6] = tmp1 - tmp2; - return m; -} -flash.geom.Matrix3D.interpolate = function(thisMat,toMat,percent) { - var m = new flash.geom.Matrix3D(); - var _g = 0; - while(_g < 16) { - var i = _g++; - m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i]) * percent; + ,get_quality: function() { + return this.quality != null?this.quality:flash.display.StageQuality.BEST; + } + ,get_mouseY: function() { + return this._mouseY; } - return m; -} -flash.geom.Matrix3D.prototype = { - set_position: function(val) { - this.rawData[12] = val.x; - this.rawData[13] = val.y; - this.rawData[14] = val.z; - return val; + ,get_mouseX: function() { + return this._mouseX; } - ,get_position: function() { - return new flash.geom.Vector3D(this.rawData[12],this.rawData[13],this.rawData[14]); + ,get_fullScreenHeight: function() { + return js.Browser.window.innerHeight; } - ,get_determinant: function() { - return -1 * ((this.rawData[0] * this.rawData[5] - this.rawData[4] * this.rawData[1]) * (this.rawData[10] * this.rawData[15] - this.rawData[14] * this.rawData[11]) - (this.rawData[0] * this.rawData[9] - this.rawData[8] * this.rawData[1]) * (this.rawData[6] * this.rawData[15] - this.rawData[14] * this.rawData[7]) + (this.rawData[0] * this.rawData[13] - this.rawData[12] * this.rawData[1]) * (this.rawData[6] * this.rawData[11] - this.rawData[10] * this.rawData[7]) + (this.rawData[4] * this.rawData[9] - this.rawData[8] * this.rawData[5]) * (this.rawData[2] * this.rawData[15] - this.rawData[14] * this.rawData[3]) - (this.rawData[4] * this.rawData[13] - this.rawData[12] * this.rawData[5]) * (this.rawData[2] * this.rawData[11] - this.rawData[10] * this.rawData[3]) + (this.rawData[8] * this.rawData[13] - this.rawData[12] * this.rawData[9]) * (this.rawData[2] * this.rawData[7] - this.rawData[6] * this.rawData[3])); + ,get_fullScreenWidth: function() { + return js.Browser.window.innerWidth; } - ,transpose: function() { - var oRawData = flash._Vector.Vector_Impl_.copy(this.rawData); - this.rawData[1] = oRawData[4]; - this.rawData[2] = oRawData[8]; - this.rawData[3] = oRawData[12]; - this.rawData[4] = oRawData[1]; - this.rawData[6] = oRawData[9]; - this.rawData[7] = oRawData[13]; - this.rawData[8] = oRawData[2]; - this.rawData[9] = oRawData[6]; - this.rawData[11] = oRawData[14]; - this.rawData[12] = oRawData[3]; - this.rawData[13] = oRawData[7]; - this.rawData[14] = oRawData[11]; + ,set_frameRate: function(speed) { + if(speed == 0) { + var window = js.Browser.window; + var __requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame; + if(__requestAnimationFrame == null) speed = 60; + } + if(speed != 0) this.__interval = 1000.0 / speed | 0; + this.__frameRate = speed; + this.__updateNextWake(); + return speed; } - ,transformVectors: function(vin,vout) { - var i = 0; - while(i + 3 <= flash._Vector.Vector_Impl_.get_length(vin)) { - var x = vin[i], y = vin[i + 1], z = vin[i + 2]; - vout[i] = x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8] + this.rawData[12]; - vout[i + 1] = x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9] + this.rawData[13]; - vout[i + 2] = x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10] + this.rawData[14]; - i += 3; + ,get_frameRate: function() { + return this.__frameRate; + } + ,set_focus: function(inObj) { + this.__onFocus(inObj); + return this.__focusObject; + } + ,get_focus: function() { + return this.__focusObject; + } + ,set_displayState: function(displayState) { + if(displayState != this.displayState && this.displayState != null) { + switch( (displayState)[1] ) { + case 0: + flash.Lib.__disableFullScreen(); + break; + case 1: + case 2: + flash.Lib.__enableFullScreen(); + break; + } } + this.displayState = displayState; + return displayState; } - ,transformVector: function(v) { - var x = v.x, y = v.y, z = v.z; - return new flash.geom.Vector3D(x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8] + this.rawData[12],x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9] + this.rawData[13],x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10] + this.rawData[14],1); + ,get_displayState: function() { + return this.displayState; } - ,recompose: function(components) { - if(flash._Vector.Vector_Impl_.get_length(components) < 3 || components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; - this.rawData[0] = 1; - this.rawData[1] = 0; - this.rawData[2] = 0; - this.rawData[3] = 0; - this.rawData[4] = 0; - this.rawData[5] = 1; - this.rawData[6] = 0; - this.rawData[7] = 0; - this.rawData[8] = 0; - this.rawData[9] = 0; - this.rawData[10] = 1; - this.rawData[11] = 0; - this.rawData[12] = 0; - this.rawData[13] = 0; - this.rawData[14] = 0; - this.rawData[15] = 1; - this.append(new flash.geom.Matrix3D([components[2].x,0.0,0.0,0.0,0.0,components[2].y,0.0,0.0,0.0,0.0,components[2].z,0.0,0.0,0.0,0.0,1.0])); - var angle; - angle = -components[1].x; - this.append(new flash.geom.Matrix3D([1,0,0,0,0,Math.cos(angle),-Math.sin(angle),0,0,Math.sin(angle),Math.cos(angle),0,0,0,0,0])); - angle = -components[1].y; - this.append(new flash.geom.Matrix3D([Math.cos(angle),0,Math.sin(angle),0,0,1,0,0,-Math.sin(angle),0,Math.cos(angle),0,0,0,0,0])); - angle = -components[1].z; - this.append(new flash.geom.Matrix3D([Math.cos(angle),-Math.sin(angle),0,0,Math.sin(angle),Math.cos(angle),0,0,0,0,1,0,0,0,0,0])); - this.set_position(components[0]); - this.rawData[15] = 1; - return true; + ,set_color: function(col) { + return this.__backgroundColour = col; } - ,prependTranslation: function(x,y,z) { - var m = new flash.geom.Matrix3D(); - m.set_position(new flash.geom.Vector3D(x,y,z)); - this.prepend(m); + ,get_color: function() { + return this.__backgroundColour; } - ,prependScale: function(xScale,yScale,zScale) { - this.prepend(new flash.geom.Matrix3D([xScale,0.0,0.0,0.0,0.0,yScale,0.0,0.0,0.0,0.0,zScale,0.0,0.0,0.0,0.0,1.0])); + ,set_backgroundColor: function(col) { + return this.__backgroundColour = col; } - ,prependRotation: function(degrees,axis,pivotPoint) { - var m = flash.geom.Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees); - if(pivotPoint != null) { - var p = pivotPoint; - m.rawData[12] += p.x; - m.rawData[13] += p.y; - m.rawData[14] += p.z; + ,get_backgroundColor: function() { + return this.__backgroundColour; + } + ,__onTouch: function(event,touch,type,touchInfo,isPrimaryTouchPoint) { + var rect = flash.Lib.mMe.__scr.getBoundingClientRect(); + var point = new flash.geom.Point(touch.pageX - rect.left,touch.pageY - rect.top); + var obj = this.__getObjectUnderPoint(point); + this._mouseX = point.x; + this._mouseY = point.y; + var stack = new Array(); + if(obj != null) obj.__getInteractiveObjectStack(stack); + if(stack.length > 0) { + stack.reverse(); + var local = obj.globalToLocal(point); + var evt = flash.events.TouchEvent.__create(type,event,touch,local,obj); + evt.touchPointID = touch.identifier; + evt.isPrimaryTouchPoint = isPrimaryTouchPoint; + this.__checkInOuts(evt,stack,touchInfo); + obj.__fireEvent(evt); + var mouseType = (function($this) { + var $r; + switch(type) { + case "touchBegin": + $r = flash.events.MouseEvent.MOUSE_DOWN; + break; + case "touchEnd": + $r = flash.events.MouseEvent.MOUSE_UP; + break; + default: + $r = (function($this) { + var $r; + if($this.__dragObject != null) $this.__drag(point); + $r = flash.events.MouseEvent.MOUSE_MOVE; + return $r; + }($this)); + } + return $r; + }(this)); + obj.__fireEvent(flash.events.MouseEvent.__create(mouseType,evt,local,obj)); + } else { + var evt = flash.events.TouchEvent.__create(type,event,touch,point,null); + evt.touchPointID = touch.identifier; + evt.isPrimaryTouchPoint = isPrimaryTouchPoint; + this.__checkInOuts(evt,stack,touchInfo); } - this.prepend(m); } - ,prepend: function(rhs) { - var m111 = rhs.rawData[0], m121 = rhs.rawData[4], m131 = rhs.rawData[8], m141 = rhs.rawData[12], m112 = rhs.rawData[1], m122 = rhs.rawData[5], m132 = rhs.rawData[9], m142 = rhs.rawData[13], m113 = rhs.rawData[2], m123 = rhs.rawData[6], m133 = rhs.rawData[10], m143 = rhs.rawData[14], m114 = rhs.rawData[3], m124 = rhs.rawData[7], m134 = rhs.rawData[11], m144 = rhs.rawData[15], m211 = this.rawData[0], m221 = this.rawData[4], m231 = this.rawData[8], m241 = this.rawData[12], m212 = this.rawData[1], m222 = this.rawData[5], m232 = this.rawData[9], m242 = this.rawData[13], m213 = this.rawData[2], m223 = this.rawData[6], m233 = this.rawData[10], m243 = this.rawData[14], m214 = this.rawData[3], m224 = this.rawData[7], m234 = this.rawData[11], m244 = this.rawData[15]; - this.rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; - this.rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; - this.rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; - this.rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; - this.rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; - this.rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; - this.rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; - this.rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; - this.rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; - this.rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; - this.rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; - this.rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; - this.rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; - this.rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; - this.rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; - this.rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; + ,__onResize: function(inW,inH) { + this.__windowWidth = inW; + this.__windowHeight = inH; + var event = new flash.events.Event(flash.events.Event.RESIZE); + event.target = this; + this.__broadcast(event); } - ,invert: function() { - var d = -1 * ((this.rawData[0] * this.rawData[5] - this.rawData[4] * this.rawData[1]) * (this.rawData[10] * this.rawData[15] - this.rawData[14] * this.rawData[11]) - (this.rawData[0] * this.rawData[9] - this.rawData[8] * this.rawData[1]) * (this.rawData[6] * this.rawData[15] - this.rawData[14] * this.rawData[7]) + (this.rawData[0] * this.rawData[13] - this.rawData[12] * this.rawData[1]) * (this.rawData[6] * this.rawData[11] - this.rawData[10] * this.rawData[7]) + (this.rawData[4] * this.rawData[9] - this.rawData[8] * this.rawData[5]) * (this.rawData[2] * this.rawData[15] - this.rawData[14] * this.rawData[3]) - (this.rawData[4] * this.rawData[13] - this.rawData[12] * this.rawData[5]) * (this.rawData[2] * this.rawData[11] - this.rawData[10] * this.rawData[3]) + (this.rawData[8] * this.rawData[13] - this.rawData[12] * this.rawData[9]) * (this.rawData[2] * this.rawData[7] - this.rawData[6] * this.rawData[3])); - var invertable = Math.abs(d) > 0.00000000001; - if(invertable) { - d = -1 / d; - var m11 = this.rawData[0]; - var m21 = this.rawData[4]; - var m31 = this.rawData[8]; - var m41 = this.rawData[12]; - var m12 = this.rawData[1]; - var m22 = this.rawData[5]; - var m32 = this.rawData[9]; - var m42 = this.rawData[13]; - var m13 = this.rawData[2]; - var m23 = this.rawData[6]; - var m33 = this.rawData[10]; - var m43 = this.rawData[14]; - var m14 = this.rawData[3]; - var m24 = this.rawData[7]; - var m34 = this.rawData[11]; - var m44 = this.rawData[15]; - this.rawData[0] = d * (m22 * (m33 * m44 - m43 * m34) - m32 * (m23 * m44 - m43 * m24) + m42 * (m23 * m34 - m33 * m24)); - this.rawData[1] = -d * (m12 * (m33 * m44 - m43 * m34) - m32 * (m13 * m44 - m43 * m14) + m42 * (m13 * m34 - m33 * m14)); - this.rawData[2] = d * (m12 * (m23 * m44 - m43 * m24) - m22 * (m13 * m44 - m43 * m14) + m42 * (m13 * m24 - m23 * m14)); - this.rawData[3] = -d * (m12 * (m23 * m34 - m33 * m24) - m22 * (m13 * m34 - m33 * m14) + m32 * (m13 * m24 - m23 * m14)); - this.rawData[4] = -d * (m21 * (m33 * m44 - m43 * m34) - m31 * (m23 * m44 - m43 * m24) + m41 * (m23 * m34 - m33 * m24)); - this.rawData[5] = d * (m11 * (m33 * m44 - m43 * m34) - m31 * (m13 * m44 - m43 * m14) + m41 * (m13 * m34 - m33 * m14)); - this.rawData[6] = -d * (m11 * (m23 * m44 - m43 * m24) - m21 * (m13 * m44 - m43 * m14) + m41 * (m13 * m24 - m23 * m14)); - this.rawData[7] = d * (m11 * (m23 * m34 - m33 * m24) - m21 * (m13 * m34 - m33 * m14) + m31 * (m13 * m24 - m23 * m14)); - this.rawData[8] = d * (m21 * (m32 * m44 - m42 * m34) - m31 * (m22 * m44 - m42 * m24) + m41 * (m22 * m34 - m32 * m24)); - this.rawData[9] = -d * (m11 * (m32 * m44 - m42 * m34) - m31 * (m12 * m44 - m42 * m14) + m41 * (m12 * m34 - m32 * m14)); - this.rawData[10] = d * (m11 * (m22 * m44 - m42 * m24) - m21 * (m12 * m44 - m42 * m14) + m41 * (m12 * m24 - m22 * m14)); - this.rawData[11] = -d * (m11 * (m22 * m34 - m32 * m24) - m21 * (m12 * m34 - m32 * m14) + m31 * (m12 * m24 - m22 * m14)); - this.rawData[12] = -d * (m21 * (m32 * m43 - m42 * m33) - m31 * (m22 * m43 - m42 * m23) + m41 * (m22 * m33 - m32 * m23)); - this.rawData[13] = d * (m11 * (m32 * m43 - m42 * m33) - m31 * (m12 * m43 - m42 * m13) + m41 * (m12 * m33 - m32 * m13)); - this.rawData[14] = -d * (m11 * (m22 * m43 - m42 * m23) - m21 * (m12 * m43 - m42 * m13) + m41 * (m12 * m23 - m22 * m13)); - this.rawData[15] = d * (m11 * (m22 * m33 - m32 * m23) - m21 * (m12 * m33 - m32 * m13) + m31 * (m12 * m23 - m22 * m13)); + ,__onMouse: function(event,type) { + var rect = flash.Lib.mMe.__scr.getBoundingClientRect(); + var point = new flash.geom.Point(event.clientX - rect.left,event.clientY - rect.top); + if(this.__dragObject != null) this.__drag(point); + var obj = this.__getObjectUnderPoint(point); + this._mouseX = point.x; + this._mouseY = point.y; + var stack = new Array(); + if(obj != null) obj.__getInteractiveObjectStack(stack); + if(stack.length > 0) { + stack.reverse(); + var local = obj.globalToLocal(point); + var evt = flash.events.MouseEvent.__create(type,event,local,obj); + this.__checkInOuts(evt,stack); + if(type == flash.events.MouseEvent.MOUSE_DOWN) this.__onFocus(stack[stack.length - 1]); + obj.__fireEvent(evt); + } else { + var evt = flash.events.MouseEvent.__create(type,event,point,null); + this.__checkInOuts(evt,stack); + } + } + ,__onFocus: function(target) { + if(target != this.__focusObject) { + if(this.__focusObject != null) this.__focusObject.__fireEvent(new flash.events.FocusEvent(flash.events.FocusEvent.FOCUS_OUT,true,false,this.__focusObject,false,0)); + target.__fireEvent(new flash.events.FocusEvent(flash.events.FocusEvent.FOCUS_IN,true,false,target,false,0)); + this.__focusObject = target; } - return invertable; } - ,interpolateTo: function(toMat,percent) { - var _g = 0; - while(_g < 16) { - var i = _g++; - this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i]) * percent; + ,__onKey: function(code,pressed,inChar,ctrl,alt,shift,keyLocation) { + var stack = new Array(); + if(this.__focusObject == null) this.__getInteractiveObjectStack(stack); else this.__focusObject.__getInteractiveObjectStack(stack); + if(stack.length > 0) { + var obj = stack[0]; + var evt = new flash.events.KeyboardEvent(pressed?flash.events.KeyboardEvent.KEY_DOWN:flash.events.KeyboardEvent.KEY_UP,true,false,inChar,code,keyLocation,ctrl,alt,shift); + obj.__fireEvent(evt); } } - ,identity: function() { - this.rawData[0] = 1; - this.rawData[1] = 0; - this.rawData[2] = 0; - this.rawData[3] = 0; - this.rawData[4] = 0; - this.rawData[5] = 1; - this.rawData[6] = 0; - this.rawData[7] = 0; - this.rawData[8] = 0; - this.rawData[9] = 0; - this.rawData[10] = 1; - this.rawData[11] = 0; - this.rawData[12] = 0; - this.rawData[13] = 0; - this.rawData[14] = 0; - this.rawData[15] = 1; + ,__handleOrientationChange: function() { } - ,deltaTransformVector: function(v) { - var x = v.x; - var y = v.y; - var z = v.z; - return new flash.geom.Vector3D(x * this.rawData[0] + y * this.rawData[1] + z * this.rawData[2] + this.rawData[3],x * this.rawData[4] + y * this.rawData[5] + z * this.rawData[6] + this.rawData[7],x * this.rawData[8] + y * this.rawData[9] + z * this.rawData[10] + this.rawData[11],0); + ,__handleAccelerometer: function(evt) { + flash.display.Stage.__acceleration.x = evt.accelerationIncludingGravity.x; + flash.display.Stage.__acceleration.y = evt.accelerationIncludingGravity.y; + flash.display.Stage.__acceleration.z = evt.accelerationIncludingGravity.z; } - ,decompose: function() { - var vec = flash._Vector.Vector_Impl_._new(); - var m = new flash.geom.Matrix3D(flash._Vector.Vector_Impl_.copy(this.rawData)); - var mr = m.rawData; - var pos = new flash.geom.Vector3D(mr[12],mr[13],mr[14]); - mr[12] = 0; - mr[13] = 0; - mr[14] = 0; - var scale = new flash.geom.Vector3D(); - scale.x = Math.sqrt(mr[0] * mr[0] + mr[1] * mr[1] + mr[2] * mr[2]); - scale.y = Math.sqrt(mr[4] * mr[4] + mr[5] * mr[5] + mr[6] * mr[6]); - scale.z = Math.sqrt(mr[8] * mr[8] + mr[9] * mr[9] + mr[10] * mr[10]); - if(mr[0] * (mr[5] * mr[10] - mr[6] * mr[9]) - mr[1] * (mr[4] * mr[10] - mr[6] * mr[8]) + mr[2] * (mr[4] * mr[9] - mr[5] * mr[8]) < 0) scale.z = -scale.z; - mr[0] /= scale.x; - mr[1] /= scale.x; - mr[2] /= scale.x; - mr[4] /= scale.y; - mr[5] /= scale.y; - mr[6] /= scale.y; - mr[8] /= scale.z; - mr[9] /= scale.z; - mr[10] /= scale.z; - var rot = new flash.geom.Vector3D(); - rot.y = Math.asin(-mr[2]); - var C = Math.cos(rot.y); - if(C > 0) { - rot.x = Math.atan2(mr[6],mr[10]); - rot.z = Math.atan2(mr[1],mr[0]); + ,__updateNextWake: function() { + if(this.__frameRate == 0) { + var __requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame; + __requestAnimationFrame($bind(this,this.__updateNextWake)); + this.__stageRender(); } else { - rot.z = 0; - rot.x = Math.atan2(mr[4],mr[5]); + js.Browser.window.clearInterval(this.__timer); + this.__timer = js.Browser.window.setInterval($bind(this,this.__stageRender),this.__interval); } - flash._Vector.Vector_Impl_.push(vec,pos); - flash._Vector.Vector_Impl_.push(vec,rot); - flash._Vector.Vector_Impl_.push(vec,scale); - return vec; } - ,copyFrom: function(other) { - var _g = 0; - while(_g < 16) { - var i = _g++; - this.rawData[i] = other.rawData[i]; + ,__stopDrag: function(sprite) { + this.__dragBounds = null; + this.__dragObject = null; + } + ,__startDrag: function(sprite,lockCenter,bounds) { + if(lockCenter == null) lockCenter = false; + this.__dragBounds = bounds == null?null:bounds.clone(); + this.__dragObject = sprite; + if(this.__dragObject != null) { + var mouse = new flash.geom.Point(this._mouseX,this._mouseY); + var p = this.__dragObject.parent; + if(p != null) mouse = p.globalToLocal(mouse); + if(lockCenter) { + var bounds1 = sprite.getBounds(this); + this.__dragOffsetX = this.__dragObject.get_x() - (bounds1.width / 2 + bounds1.x); + this.__dragOffsetY = this.__dragObject.get_y() - (bounds1.height / 2 + bounds1.y); + } else { + this.__dragOffsetX = this.__dragObject.get_x() - mouse.x; + this.__dragOffsetY = this.__dragObject.get_y() - mouse.y; + } + } + } + ,__stageRender: function(_) { + if(!this.__stageActive) { + this.__onResize(this.__windowWidth,this.__windowHeight); + var event = new flash.events.Event(flash.events.Event.ACTIVATE); + event.target = this; + this.__broadcast(event); + this.__stageActive = true; + } + var _g1 = 0, _g = this.__uIEventsQueueIndex; + while(_g1 < _g) { + var i = _g1++; + if(this.__uIEventsQueue[i] != null) this.__processStageEvent(this.__uIEventsQueue[i]); + } + this.__uIEventsQueueIndex = 0; + var event = new flash.events.Event(flash.events.Event.ENTER_FRAME); + this.__broadcast(event); + if(this.__invalid) { + var event1 = new flash.events.Event(flash.events.Event.RENDER); + this.__broadcast(event1); + } + this.__renderAll(); + } + ,__renderToCanvas: function(canvas) { + canvas.width = canvas.width; + this.__render(canvas); + } + ,__renderAll: function() { + this.__render(null,null); + } + ,__queueStageEvent: function(evt) { + this.__uIEventsQueue[this.__uIEventsQueueIndex++] = evt; + } + ,__processStageEvent: function(evt) { + evt.stopPropagation(); + switch(evt.type) { + case "resize": + this.__onResize(flash.Lib.__getWidth(),flash.Lib.__getHeight()); + break; + case "focus": + this.__onFocus(this); + if(!this.__focusObjectActivated) { + this.__focusObjectActivated = true; + this.dispatchEvent(new flash.events.Event(flash.events.Event.ACTIVATE)); + } + break; + case "blur": + if(this.__focusObjectActivated) { + this.__focusObjectActivated = false; + this.dispatchEvent(new flash.events.Event(flash.events.Event.DEACTIVATE)); + } + break; + case "mousemove": + this.__onMouse(evt,flash.events.MouseEvent.MOUSE_MOVE); + break; + case "mousedown": + this.__onMouse(evt,flash.events.MouseEvent.MOUSE_DOWN); + break; + case "mouseup": + this.__onMouse(evt,flash.events.MouseEvent.MOUSE_UP); + break; + case "click": + this.__onMouse(evt,flash.events.MouseEvent.CLICK); + break; + case "mousewheel": + this.__onMouse(evt,flash.events.MouseEvent.MOUSE_WHEEL); + break; + case "dblclick": + this.__onMouse(evt,flash.events.MouseEvent.DOUBLE_CLICK); + break; + case "keydown": + var evt1 = evt; + var keyCode = evt1.keyCode != null?evt1.keyCode:evt1.which; + keyCode = flash.ui.Keyboard.__convertMozillaCode(keyCode); + this.__onKey(keyCode,true,evt1.charCode,evt1.ctrlKey,evt1.altKey,evt1.shiftKey,evt1.keyLocation); + break; + case "keyup": + var evt1 = evt; + var keyCode = evt1.keyCode != null?evt1.keyCode:evt1.which; + keyCode = flash.ui.Keyboard.__convertMozillaCode(keyCode); + this.__onKey(keyCode,false,evt1.charCode,evt1.ctrlKey,evt1.altKey,evt1.shiftKey,evt1.keyLocation); + break; + case "touchstart": + var evt1 = evt; + evt1.preventDefault(); + var touchInfo = new flash.display._Stage.TouchInfo(); + this.__touchInfo[evt1.changedTouches[0].identifier] = touchInfo; + this.__onTouch(evt1,evt1.changedTouches[0],"touchBegin",touchInfo,false); + break; + case "touchmove": + var evt1 = evt; + evt1.preventDefault(); + var touchInfo = this.__touchInfo[evt1.changedTouches[0].identifier]; + this.__onTouch(evt1,evt1.changedTouches[0],"touchMove",touchInfo,true); + break; + case "touchend": + var evt1 = evt; + evt1.preventDefault(); + var touchInfo = this.__touchInfo[evt1.changedTouches[0].identifier]; + this.__onTouch(evt1,evt1.changedTouches[0],"touchEnd",touchInfo,true); + this.__touchInfo[evt1.changedTouches[0].identifier] = null; + break; + case "devicemotion": + var evt1 = evt; + this.__handleAccelerometer(evt1); + break; + case "orientationchange": + this.__handleOrientationChange(); + break; + default: + } + } + ,__isOnStage: function() { + return true; + } + ,__drag: function(point) { + var p = this.__dragObject.parent; + if(p != null) point = p.globalToLocal(point); + var x = point.x + this.__dragOffsetX; + var y = point.y + this.__dragOffsetY; + if(this.__dragBounds != null) { + if(x < this.__dragBounds.x) x = this.__dragBounds.x; else if(x > this.__dragBounds.get_right()) x = this.__dragBounds.get_right(); + if(y < this.__dragBounds.y) y = this.__dragBounds.y; else if(y > this.__dragBounds.get_bottom()) y = this.__dragBounds.get_bottom(); + } + this.__dragObject.set_x(x); + this.__dragObject.set_y(y); + } + ,__checkInOuts: function(event,stack,touchInfo) { + var prev = touchInfo == null?this.__mouseOverObjects:touchInfo.touchOverObjects; + var changeEvents = touchInfo == null?flash.display.Stage.__mouseChanges:flash.display.Stage.__touchChanges; + var new_n = stack.length; + var new_obj = new_n > 0?stack[new_n - 1]:null; + var old_n = prev.length; + var old_obj = old_n > 0?prev[old_n - 1]:null; + if(new_obj != old_obj) { + if(old_obj != null) old_obj.__fireEvent(event.__createSimilar(changeEvents[0],new_obj,old_obj)); + if(new_obj != null) new_obj.__fireEvent(event.__createSimilar(changeEvents[1],old_obj,new_obj)); + var common = 0; + while(common < new_n && common < old_n && stack[common] == prev[common]) common++; + var rollOut = event.__createSimilar(changeEvents[2],new_obj,old_obj); + var i = old_n - 1; + while(i >= common) { + prev[i].dispatchEvent(rollOut); + i--; + } + var rollOver = event.__createSimilar(changeEvents[3],old_obj); + var i1 = new_n - 1; + while(i1 >= common) { + stack[i1].dispatchEvent(rollOver); + i1--; + } + if(touchInfo == null) this.__mouseOverObjects = stack; else touchInfo.touchOverObjects = stack; } } - ,clone: function() { - return new flash.geom.Matrix3D(flash._Vector.Vector_Impl_.copy(this.rawData)); + ,toString: function() { + return "[Stage id=" + this.___id + "]"; } - ,appendTranslation: function(x,y,z) { - this.rawData[12] += x; - this.rawData[13] += y; - this.rawData[14] += z; + ,invalidate: function() { + this.__invalid = true; } - ,appendScale: function(xScale,yScale,zScale) { - this.append(new flash.geom.Matrix3D([xScale,0.0,0.0,0.0,0.0,yScale,0.0,0.0,0.0,0.0,zScale,0.0,0.0,0.0,0.0,1.0])); + ,__class__: flash.display.Stage + ,__properties__: $extend(flash.display.DisplayObjectContainer.prototype.__properties__,{set_backgroundColor:"set_backgroundColor",get_backgroundColor:"get_backgroundColor",set_color:"set_color",get_color:"get_color",set_displayState:"set_displayState",get_displayState:"get_displayState",set_focus:"set_focus",get_focus:"get_focus",set_frameRate:"set_frameRate",get_frameRate:"get_frameRate",get_fullScreenHeight:"get_fullScreenHeight",get_fullScreenWidth:"get_fullScreenWidth",set_quality:"set_quality",get_quality:"get_quality",set_showDefaultContextMenu:"set_showDefaultContextMenu",get_showDefaultContextMenu:"get_showDefaultContextMenu",get_stageHeight:"get_stageHeight",get_stageWidth:"get_stageWidth"}) +}); +flash.display._Stage = {} +flash.display._Stage.TouchInfo = function() { + this.touchOverObjects = []; +}; +$hxClasses["flash.display._Stage.TouchInfo"] = flash.display._Stage.TouchInfo; +flash.display._Stage.TouchInfo.__name__ = ["flash","display","_Stage","TouchInfo"]; +flash.display._Stage.TouchInfo.prototype = { + __class__: flash.display._Stage.TouchInfo +} +flash.display.StageAlign = $hxClasses["flash.display.StageAlign"] = { __ename__ : true, __constructs__ : ["TOP_RIGHT","TOP_LEFT","TOP","RIGHT","LEFT","BOTTOM_RIGHT","BOTTOM_LEFT","BOTTOM"] } +flash.display.StageAlign.TOP_RIGHT = ["TOP_RIGHT",0]; +flash.display.StageAlign.TOP_RIGHT.toString = $estr; +flash.display.StageAlign.TOP_RIGHT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.TOP_LEFT = ["TOP_LEFT",1]; +flash.display.StageAlign.TOP_LEFT.toString = $estr; +flash.display.StageAlign.TOP_LEFT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.TOP = ["TOP",2]; +flash.display.StageAlign.TOP.toString = $estr; +flash.display.StageAlign.TOP.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.RIGHT = ["RIGHT",3]; +flash.display.StageAlign.RIGHT.toString = $estr; +flash.display.StageAlign.RIGHT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.LEFT = ["LEFT",4]; +flash.display.StageAlign.LEFT.toString = $estr; +flash.display.StageAlign.LEFT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.BOTTOM_RIGHT = ["BOTTOM_RIGHT",5]; +flash.display.StageAlign.BOTTOM_RIGHT.toString = $estr; +flash.display.StageAlign.BOTTOM_RIGHT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.BOTTOM_LEFT = ["BOTTOM_LEFT",6]; +flash.display.StageAlign.BOTTOM_LEFT.toString = $estr; +flash.display.StageAlign.BOTTOM_LEFT.__enum__ = flash.display.StageAlign; +flash.display.StageAlign.BOTTOM = ["BOTTOM",7]; +flash.display.StageAlign.BOTTOM.toString = $estr; +flash.display.StageAlign.BOTTOM.__enum__ = flash.display.StageAlign; +flash.display.StageDisplayState = $hxClasses["flash.display.StageDisplayState"] = { __ename__ : true, __constructs__ : ["NORMAL","FULL_SCREEN","FULL_SCREEN_INTERACTIVE"] } +flash.display.StageDisplayState.NORMAL = ["NORMAL",0]; +flash.display.StageDisplayState.NORMAL.toString = $estr; +flash.display.StageDisplayState.NORMAL.__enum__ = flash.display.StageDisplayState; +flash.display.StageDisplayState.FULL_SCREEN = ["FULL_SCREEN",1]; +flash.display.StageDisplayState.FULL_SCREEN.toString = $estr; +flash.display.StageDisplayState.FULL_SCREEN.__enum__ = flash.display.StageDisplayState; +flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE = ["FULL_SCREEN_INTERACTIVE",2]; +flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE.toString = $estr; +flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE.__enum__ = flash.display.StageDisplayState; +flash.display.StageQuality = function() { } +$hxClasses["flash.display.StageQuality"] = flash.display.StageQuality; +flash.display.StageQuality.__name__ = ["flash","display","StageQuality"]; +flash.display.StageScaleMode = $hxClasses["flash.display.StageScaleMode"] = { __ename__ : true, __constructs__ : ["SHOW_ALL","NO_SCALE","NO_BORDER","EXACT_FIT"] } +flash.display.StageScaleMode.SHOW_ALL = ["SHOW_ALL",0]; +flash.display.StageScaleMode.SHOW_ALL.toString = $estr; +flash.display.StageScaleMode.SHOW_ALL.__enum__ = flash.display.StageScaleMode; +flash.display.StageScaleMode.NO_SCALE = ["NO_SCALE",1]; +flash.display.StageScaleMode.NO_SCALE.toString = $estr; +flash.display.StageScaleMode.NO_SCALE.__enum__ = flash.display.StageScaleMode; +flash.display.StageScaleMode.NO_BORDER = ["NO_BORDER",2]; +flash.display.StageScaleMode.NO_BORDER.toString = $estr; +flash.display.StageScaleMode.NO_BORDER.__enum__ = flash.display.StageScaleMode; +flash.display.StageScaleMode.EXACT_FIT = ["EXACT_FIT",3]; +flash.display.StageScaleMode.EXACT_FIT.toString = $estr; +flash.display.StageScaleMode.EXACT_FIT.__enum__ = flash.display.StageScaleMode; +flash.errors = {} +flash.errors.Error = function(message,id) { + if(id == null) id = 0; + if(message == null) message = ""; + this.message = message; + this.errorID = id; +}; +$hxClasses["flash.errors.Error"] = flash.errors.Error; +flash.errors.Error.__name__ = ["flash","errors","Error"]; +flash.errors.Error.prototype = { + toString: function() { + if(this.message != null) return this.message; else return "Error"; } - ,appendRotation: function(degrees,axis,pivotPoint) { - var m = flash.geom.Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees); - if(pivotPoint != null) { - var p = pivotPoint; - m.rawData[12] += p.x; - m.rawData[13] += p.y; - m.rawData[14] += p.z; - } - this.append(m); + ,getStackTrace: function() { + return haxe.CallStack.toString(haxe.CallStack.exceptionStack()); } - ,append: function(lhs) { - var m111 = this.rawData[0], m121 = this.rawData[4], m131 = this.rawData[8], m141 = this.rawData[12], m112 = this.rawData[1], m122 = this.rawData[5], m132 = this.rawData[9], m142 = this.rawData[13], m113 = this.rawData[2], m123 = this.rawData[6], m133 = this.rawData[10], m143 = this.rawData[14], m114 = this.rawData[3], m124 = this.rawData[7], m134 = this.rawData[11], m144 = this.rawData[15], m211 = lhs.rawData[0], m221 = lhs.rawData[4], m231 = lhs.rawData[8], m241 = lhs.rawData[12], m212 = lhs.rawData[1], m222 = lhs.rawData[5], m232 = lhs.rawData[9], m242 = lhs.rawData[13], m213 = lhs.rawData[2], m223 = lhs.rawData[6], m233 = lhs.rawData[10], m243 = lhs.rawData[14], m214 = lhs.rawData[3], m224 = lhs.rawData[7], m234 = lhs.rawData[11], m244 = lhs.rawData[15]; - this.rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; - this.rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; - this.rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; - this.rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; - this.rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; - this.rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; - this.rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; - this.rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; - this.rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; - this.rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; - this.rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; - this.rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; - this.rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; - this.rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; - this.rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; - this.rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; + ,__class__: flash.errors.Error +} +flash.errors.IOError = function(message) { + if(message == null) message = ""; + flash.errors.Error.call(this,message); +}; +$hxClasses["flash.errors.IOError"] = flash.errors.IOError; +flash.errors.IOError.__name__ = ["flash","errors","IOError"]; +flash.errors.IOError.__super__ = flash.errors.Error; +flash.errors.IOError.prototype = $extend(flash.errors.Error.prototype,{ + __class__: flash.errors.IOError +}); +flash.events.TextEvent = function(type,bubbles,cancelable,text) { + if(text == null) text = ""; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.Event.call(this,type,bubbles,cancelable); + this.text = text; +}; +$hxClasses["flash.events.TextEvent"] = flash.events.TextEvent; +flash.events.TextEvent.__name__ = ["flash","events","TextEvent"]; +flash.events.TextEvent.__super__ = flash.events.Event; +flash.events.TextEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.TextEvent +}); +flash.events.ErrorEvent = function(type,bubbles,cancelable,text,id) { + if(id == null) id = 0; + flash.events.TextEvent.call(this,type,bubbles,cancelable); + this.text = text; + this.errorID = id; +}; +$hxClasses["flash.events.ErrorEvent"] = flash.events.ErrorEvent; +flash.events.ErrorEvent.__name__ = ["flash","events","ErrorEvent"]; +flash.events.ErrorEvent.__super__ = flash.events.TextEvent; +flash.events.ErrorEvent.prototype = $extend(flash.events.TextEvent.prototype,{ + __class__: flash.events.ErrorEvent +}); +flash.events.Listener = function(inListener,inUseCapture,inPriority) { + this.mListner = inListener; + this.mUseCapture = inUseCapture; + this.mPriority = inPriority; + this.mID = flash.events.Listener.sIDs++; +}; +$hxClasses["flash.events.Listener"] = flash.events.Listener; +flash.events.Listener.__name__ = ["flash","events","Listener"]; +flash.events.Listener.prototype = { + Is: function(inListener,inCapture) { + return Reflect.compareMethods(this.mListner,inListener) && this.mUseCapture == inCapture; } - ,__class__: flash.geom.Matrix3D - ,__properties__: {get_determinant:"get_determinant",set_position:"set_position",get_position:"get_position"} + ,dispatchEvent: function(event) { + this.mListner(event); + } + ,__class__: flash.events.Listener } -flash.geom.Point = function(inX,inY) { - if(inY == null) inY = 0; - if(inX == null) inX = 0; - this.x = inX; - this.y = inY; +flash.events.EventPhase = function() { } +$hxClasses["flash.events.EventPhase"] = flash.events.EventPhase; +flash.events.EventPhase.__name__ = ["flash","events","EventPhase"]; +flash.events.FocusEvent = function(type,bubbles,cancelable,inObject,inShiftKey,inKeyCode) { + if(inKeyCode == null) inKeyCode = 0; + if(inShiftKey == null) inShiftKey = false; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.Event.call(this,type,bubbles,cancelable); + this.keyCode = inKeyCode; + this.shiftKey = inShiftKey == null?false:inShiftKey; + this.target = inObject; +}; +$hxClasses["flash.events.FocusEvent"] = flash.events.FocusEvent; +flash.events.FocusEvent.__name__ = ["flash","events","FocusEvent"]; +flash.events.FocusEvent.__super__ = flash.events.Event; +flash.events.FocusEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.FocusEvent +}); +flash.events.HTTPStatusEvent = function(type,bubbles,cancelable,status) { + if(status == null) status = 0; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + this.status = status; + flash.events.Event.call(this,type,bubbles,cancelable); +}; +$hxClasses["flash.events.HTTPStatusEvent"] = flash.events.HTTPStatusEvent; +flash.events.HTTPStatusEvent.__name__ = ["flash","events","HTTPStatusEvent"]; +flash.events.HTTPStatusEvent.__super__ = flash.events.Event; +flash.events.HTTPStatusEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.HTTPStatusEvent +}); +flash.events.IOErrorEvent = function(type,bubbles,cancelable,inText) { + if(inText == null) inText = ""; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.Event.call(this,type,bubbles,cancelable); + this.text = inText; +}; +$hxClasses["flash.events.IOErrorEvent"] = flash.events.IOErrorEvent; +flash.events.IOErrorEvent.__name__ = ["flash","events","IOErrorEvent"]; +flash.events.IOErrorEvent.__super__ = flash.events.Event; +flash.events.IOErrorEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.IOErrorEvent +}); +flash.events.KeyboardEvent = function(type,bubbles,cancelable,inCharCode,inKeyCode,inKeyLocation,inCtrlKey,inAltKey,inShiftKey,controlKeyValue,commandKeyValue) { + if(commandKeyValue == null) commandKeyValue = false; + if(controlKeyValue == null) controlKeyValue = false; + if(inShiftKey == null) inShiftKey = false; + if(inAltKey == null) inAltKey = false; + if(inCtrlKey == null) inCtrlKey = false; + if(inKeyLocation == null) inKeyLocation = 0; + if(inKeyCode == null) inKeyCode = 0; + if(inCharCode == null) inCharCode = 0; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.Event.call(this,type,bubbles,cancelable); + this.altKey = inAltKey == null?false:inAltKey; + this.charCode = inCharCode == null?0:inCharCode; + this.ctrlKey = inCtrlKey == null?false:inCtrlKey; + this.commandKey = commandKeyValue; + this.controlKey = controlKeyValue; + this.keyCode = inKeyCode; + this.keyLocation = inKeyLocation == null?0:inKeyLocation; + this.shiftKey = inShiftKey == null?false:inShiftKey; +}; +$hxClasses["flash.events.KeyboardEvent"] = flash.events.KeyboardEvent; +flash.events.KeyboardEvent.__name__ = ["flash","events","KeyboardEvent"]; +flash.events.KeyboardEvent.__super__ = flash.events.Event; +flash.events.KeyboardEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.KeyboardEvent +}); +flash.events.ProgressEvent = function(type,bubbles,cancelable,bytesLoaded,bytesTotal) { + if(bytesTotal == null) bytesTotal = 0; + if(bytesLoaded == null) bytesLoaded = 0; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.Event.call(this,type,bubbles,cancelable); + this.bytesLoaded = bytesLoaded; + this.bytesTotal = bytesTotal; }; -$hxClasses["flash.geom.Point"] = flash.geom.Point; -flash.geom.Point.__name__ = ["flash","geom","Point"]; -flash.geom.Point.distance = function(pt1,pt2) { - var dx = pt1.x - pt2.x; - var dy = pt1.y - pt2.y; - return Math.sqrt(dx * dx + dy * dy); -} -flash.geom.Point.interpolate = function(pt1,pt2,f) { - return new flash.geom.Point(pt2.x + f * (pt1.x - pt2.x),pt2.y + f * (pt1.y - pt2.y)); -} -flash.geom.Point.polar = function(len,angle) { - return new flash.geom.Point(len * Math.cos(angle),len * Math.sin(angle)); +$hxClasses["flash.events.ProgressEvent"] = flash.events.ProgressEvent; +flash.events.ProgressEvent.__name__ = ["flash","events","ProgressEvent"]; +flash.events.ProgressEvent.__super__ = flash.events.Event; +flash.events.ProgressEvent.prototype = $extend(flash.events.Event.prototype,{ + __class__: flash.events.ProgressEvent +}); +flash.events.SecurityErrorEvent = function(type,bubbles,cancelable,text) { + if(text == null) text = ""; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = false; + flash.events.ErrorEvent.call(this,type,bubbles,cancelable); + this.text = text; +}; +$hxClasses["flash.events.SecurityErrorEvent"] = flash.events.SecurityErrorEvent; +flash.events.SecurityErrorEvent.__name__ = ["flash","events","SecurityErrorEvent"]; +flash.events.SecurityErrorEvent.__super__ = flash.events.ErrorEvent; +flash.events.SecurityErrorEvent.prototype = $extend(flash.events.ErrorEvent.prototype,{ + __class__: flash.events.SecurityErrorEvent +}); +flash.events.TouchEvent = function(type,bubbles,cancelable,localX,localY,relatedObject,ctrlKey,altKey,shiftKey,buttonDown,delta,commandKey,clickCount) { + if(clickCount == null) clickCount = 0; + if(commandKey == null) commandKey = false; + if(delta == null) delta = 0; + if(buttonDown == null) buttonDown = false; + if(shiftKey == null) shiftKey = false; + if(altKey == null) altKey = false; + if(ctrlKey == null) ctrlKey = false; + if(localY == null) localY = 0; + if(localX == null) localX = 0; + if(cancelable == null) cancelable = false; + if(bubbles == null) bubbles = true; + flash.events.Event.call(this,type,bubbles,cancelable); + this.shiftKey = shiftKey; + this.altKey = altKey; + this.ctrlKey = ctrlKey; + this.bubbles = bubbles; + this.relatedObject = relatedObject; + this.delta = delta; + this.localX = localX; + this.localY = localY; + this.buttonDown = buttonDown; + this.commandKey = commandKey; + this.touchPointID = 0; + this.isPrimaryTouchPoint = true; +}; +$hxClasses["flash.events.TouchEvent"] = flash.events.TouchEvent; +flash.events.TouchEvent.__name__ = ["flash","events","TouchEvent"]; +flash.events.TouchEvent.__create = function(type,event,touch,local,target) { + var evt = new flash.events.TouchEvent(type,true,false,local.x,local.y,null,event.ctrlKey,event.altKey,event.shiftKey,false,0,null,0); + evt.stageX = flash.Lib.get_current().get_stage().get_mouseX(); + evt.stageY = flash.Lib.get_current().get_stage().get_mouseY(); + evt.target = target; + return evt; } -flash.geom.Point.prototype = { - get_length: function() { - return Math.sqrt(this.x * this.x + this.y * this.y); - } - ,subtract: function(v) { - return new flash.geom.Point(this.x - v.x,this.y - v.y); - } - ,setTo: function(xa,ya) { - this.x = xa; - this.y = ya; - } - ,offset: function(dx,dy) { - this.x += dx; - this.y += dy; +flash.events.TouchEvent.__super__ = flash.events.Event; +flash.events.TouchEvent.prototype = $extend(flash.events.Event.prototype,{ + __createSimilar: function(type,related,targ) { + var result = new flash.events.TouchEvent(type,this.bubbles,this.cancelable,this.localX,this.localY,related == null?this.relatedObject:related,this.ctrlKey,this.altKey,this.shiftKey,this.buttonDown,this.delta,this.commandKey); + result.touchPointID = this.touchPointID; + result.isPrimaryTouchPoint = this.isPrimaryTouchPoint; + if(targ != null) result.target = targ; + return result; } - ,normalize: function(thickness) { - if(this.x == 0 && this.y == 0) return; else { - var norm = thickness / Math.sqrt(this.x * this.x + this.y * this.y); - this.x *= norm; - this.y *= norm; - } + ,__class__: flash.events.TouchEvent +}); +flash.filters = {} +flash.filters.BitmapFilter = function(inType) { + this._mType = inType; +}; +$hxClasses["flash.filters.BitmapFilter"] = flash.filters.BitmapFilter; +flash.filters.BitmapFilter.__name__ = ["flash","filters","BitmapFilter"]; +flash.filters.BitmapFilter.prototype = { + __applyFilter: function(surface,rect,refreshCache) { + if(refreshCache == null) refreshCache = false; } - ,equals: function(toCompare) { - return toCompare.x == this.x && toCompare.y == this.y; + ,__preFilter: function(surface) { } ,clone: function() { - return new flash.geom.Point(this.x,this.y); - } - ,add: function(v) { - return new flash.geom.Point(v.x + this.x,v.y + this.y); + return new flash.filters.BitmapFilter(this._mType); } - ,__class__: flash.geom.Point - ,__properties__: {get_length:"get_length"} + ,__class__: flash.filters.BitmapFilter } -flash.geom.Rectangle = function(inX,inY,inWidth,inHeight) { - if(inHeight == null) inHeight = 0; - if(inWidth == null) inWidth = 0; - if(inY == null) inY = 0; - if(inX == null) inX = 0; - this.x = inX; - this.y = inY; - this.width = inWidth; - this.height = inHeight; +flash.filters.DropShadowFilter = function(in_distance,in_angle,in_color,in_alpha,in_blurX,in_blurY,in_strength,in_quality,in_inner,in_knockout,in_hideObject) { + if(in_hideObject == null) in_hideObject = false; + if(in_knockout == null) in_knockout = false; + if(in_inner == null) in_inner = false; + if(in_quality == null) in_quality = 1; + if(in_strength == null) in_strength = 1.0; + if(in_blurY == null) in_blurY = 4.0; + if(in_blurX == null) in_blurX = 4.0; + if(in_alpha == null) in_alpha = 1.0; + if(in_color == null) in_color = 0; + if(in_angle == null) in_angle = 45.0; + if(in_distance == null) in_distance = 4.0; + flash.filters.BitmapFilter.call(this,"DropShadowFilter"); + this.distance = in_distance; + this.angle = in_angle; + this.color = in_color; + this.alpha = in_alpha; + this.blurX = in_blurX; + this.blurY = in_blurX; + this.strength = in_strength; + this.quality = in_quality; + this.inner = in_inner; + this.knockout = in_knockout; + this.hideObject = in_hideObject; + this.___cached = false; }; -$hxClasses["flash.geom.Rectangle"] = flash.geom.Rectangle; -flash.geom.Rectangle.__name__ = ["flash","geom","Rectangle"]; -flash.geom.Rectangle.prototype = { - set_topLeft: function(p) { - this.x = p.x; - this.y = p.y; - return p.clone(); - } - ,get_topLeft: function() { - return new flash.geom.Point(this.x,this.y); - } - ,set_top: function(t) { - this.height -= t - this.y; - this.y = t; - return t; - } - ,get_top: function() { - return this.y; - } - ,set_size: function(p) { - this.width = p.x; - this.height = p.y; - return p.clone(); - } - ,get_size: function() { - return new flash.geom.Point(this.width,this.height); - } - ,set_right: function(r) { - this.width = r - this.x; - return r; - } - ,get_right: function() { - return this.x + this.width; - } - ,set_left: function(l) { - this.width -= l - this.x; - this.x = l; - return l; - } - ,get_left: function() { - return this.x; - } - ,set_bottomRight: function(p) { - this.width = p.x - this.x; - this.height = p.y - this.y; - return p.clone(); - } - ,get_bottomRight: function() { - return new flash.geom.Point(this.x + this.width,this.y + this.height); - } - ,set_bottom: function(b) { - this.height = b - this.y; - return b; - } - ,get_bottom: function() { - return this.y + this.height; - } - ,union: function(toUnion) { - var x0 = this.x > toUnion.x?toUnion.x:this.x; - var x1 = this.get_right() < toUnion.get_right()?toUnion.get_right():this.get_right(); - var y0 = this.y > toUnion.y?toUnion.y:this.y; - var y1 = this.get_bottom() < toUnion.get_bottom()?toUnion.get_bottom():this.get_bottom(); - return new flash.geom.Rectangle(x0,y0,x1 - x0,y1 - y0); - } - ,transform: function(m) { - var tx0 = m.a * this.x + m.c * this.y; - var tx1 = tx0; - var ty0 = m.b * this.x + m.d * this.y; - var ty1 = tx0; - var tx = m.a * (this.x + this.width) + m.c * this.y; - var ty = m.b * (this.x + this.width) + m.d * this.y; - if(tx < tx0) tx0 = tx; - if(ty < ty0) ty0 = ty; - if(tx > tx1) tx1 = tx; - if(ty > ty1) ty1 = ty; - tx = m.a * (this.x + this.width) + m.c * (this.y + this.height); - ty = m.b * (this.x + this.width) + m.d * (this.y + this.height); - if(tx < tx0) tx0 = tx; - if(ty < ty0) ty0 = ty; - if(tx > tx1) tx1 = tx; - if(ty > ty1) ty1 = ty; - tx = m.a * this.x + m.c * (this.y + this.height); - ty = m.b * this.x + m.d * (this.y + this.height); - if(tx < tx0) tx0 = tx; - if(ty < ty0) ty0 = ty; - if(tx > tx1) tx1 = tx; - if(ty > ty1) ty1 = ty; - return new flash.geom.Rectangle(tx0 + m.tx,ty0 + m.ty,tx1 - tx0,ty1 - ty0); +$hxClasses["flash.filters.DropShadowFilter"] = flash.filters.DropShadowFilter; +flash.filters.DropShadowFilter.__name__ = ["flash","filters","DropShadowFilter"]; +flash.filters.DropShadowFilter.__super__ = flash.filters.BitmapFilter; +flash.filters.DropShadowFilter.prototype = $extend(flash.filters.BitmapFilter.prototype,{ + __applyFilter: function(surface,rect,refreshCache) { + if(refreshCache == null) refreshCache = false; + if(!this.___cached || refreshCache) { + var distanceX = this.distance * Math.sin(2 * Math.PI * this.angle / 360.0); + var distanceY = this.distance * Math.cos(2 * Math.PI * this.angle / 360.0); + var blurRadius = Math.max(this.blurX,this.blurY); + var context = surface.getContext("2d"); + context.shadowOffsetX = distanceX; + context.shadowOffsetY = distanceY; + context.shadowBlur = blurRadius; + context.shadowColor = "rgba(" + (this.color >> 16 & 255) + "," + (this.color >> 8 & 255) + "," + (this.color & 255) + "," + this.alpha + ")"; + this.___cached = true; + } } - ,setEmpty: function() { - this.x = this.y = this.width = this.height = 0; + ,clone: function() { + return new flash.filters.DropShadowFilter(this.distance,this.angle,this.color,this.alpha,this.blurX,this.blurY,this.strength,this.quality,this.inner,this.knockout,this.hideObject); } - ,offsetPoint: function(point) { - this.x += point.x; - this.y += point.y; + ,__class__: flash.filters.DropShadowFilter +}); +flash.geom = {} +flash.geom.ColorTransform = function(inRedMultiplier,inGreenMultiplier,inBlueMultiplier,inAlphaMultiplier,inRedOffset,inGreenOffset,inBlueOffset,inAlphaOffset) { + if(inAlphaOffset == null) inAlphaOffset = 0; + if(inBlueOffset == null) inBlueOffset = 0; + if(inGreenOffset == null) inGreenOffset = 0; + if(inRedOffset == null) inRedOffset = 0; + if(inAlphaMultiplier == null) inAlphaMultiplier = 1; + if(inBlueMultiplier == null) inBlueMultiplier = 1; + if(inGreenMultiplier == null) inGreenMultiplier = 1; + if(inRedMultiplier == null) inRedMultiplier = 1; + this.redMultiplier = inRedMultiplier == null?1.0:inRedMultiplier; + this.greenMultiplier = inGreenMultiplier == null?1.0:inGreenMultiplier; + this.blueMultiplier = inBlueMultiplier == null?1.0:inBlueMultiplier; + this.alphaMultiplier = inAlphaMultiplier == null?1.0:inAlphaMultiplier; + this.redOffset = inRedOffset == null?0.0:inRedOffset; + this.greenOffset = inGreenOffset == null?0.0:inGreenOffset; + this.blueOffset = inBlueOffset == null?0.0:inBlueOffset; + this.alphaOffset = inAlphaOffset == null?0.0:inAlphaOffset; +}; +$hxClasses["flash.geom.ColorTransform"] = flash.geom.ColorTransform; +flash.geom.ColorTransform.__name__ = ["flash","geom","ColorTransform"]; +flash.geom.ColorTransform.prototype = { + set_color: function(value) { + this.redOffset = value >> 16 & 255; + this.greenOffset = value >> 8 & 255; + this.blueOffset = value & 255; + this.redMultiplier = 0; + this.greenMultiplier = 0; + this.blueMultiplier = 0; + return this.get_color(); } - ,offset: function(dx,dy) { - this.x += dx; - this.y += dy; + ,get_color: function() { + return (this.redOffset | 0) << 16 | (this.greenOffset | 0) << 8 | (this.blueOffset | 0); } - ,isEmpty: function() { - return this.width <= 0 || this.height <= 0; + ,concat: function(second) { + this.redMultiplier += second.redMultiplier; + this.greenMultiplier += second.greenMultiplier; + this.blueMultiplier += second.blueMultiplier; + this.alphaMultiplier += second.alphaMultiplier; } - ,intersects: function(toIntersect) { - var x0 = this.x < toIntersect.x?toIntersect.x:this.x; - var x1 = this.get_right() > toIntersect.get_right()?toIntersect.get_right():this.get_right(); - if(x1 <= x0) return false; - var y0 = this.y < toIntersect.y?toIntersect.y:this.y; - var y1 = this.get_bottom() > toIntersect.get_bottom()?toIntersect.get_bottom():this.get_bottom(); - return y1 > y0; + ,__class__: flash.geom.ColorTransform + ,__properties__: {set_color:"set_color",get_color:"get_color"} +} +flash.geom.Matrix = function(in_a,in_b,in_c,in_d,in_tx,in_ty) { + if(in_ty == null) in_ty = 0; + if(in_tx == null) in_tx = 0; + if(in_d == null) in_d = 1; + if(in_c == null) in_c = 0; + if(in_b == null) in_b = 0; + if(in_a == null) in_a = 1; + this.a = in_a; + this.b = in_b; + this.c = in_c; + this.d = in_d; + this.set_tx(in_tx); + this.set_ty(in_ty); + this._sx = 1.0; + this._sy = 1.0; +}; +$hxClasses["flash.geom.Matrix"] = flash.geom.Matrix; +flash.geom.Matrix.__name__ = ["flash","geom","Matrix"]; +flash.geom.Matrix.prototype = { + set_ty: function(inValue) { + this.ty = inValue; + return this.ty; } - ,intersection: function(toIntersect) { - var x0 = this.x < toIntersect.x?toIntersect.x:this.x; - var x1 = this.get_right() > toIntersect.get_right()?toIntersect.get_right():this.get_right(); - if(x1 <= x0) return new flash.geom.Rectangle(); - var y0 = this.y < toIntersect.y?toIntersect.y:this.y; - var y1 = this.get_bottom() > toIntersect.get_bottom()?toIntersect.get_bottom():this.get_bottom(); - if(y1 <= y0) return new flash.geom.Rectangle(); - return new flash.geom.Rectangle(x0,y0,x1 - x0,y1 - y0); + ,set_tx: function(inValue) { + this.tx = inValue; + return this.tx; } - ,inflatePoint: function(point) { - this.inflate(point.x,point.y); + ,__translateTransformed: function(inPos) { + this.set_tx(inPos.x * this.a + inPos.y * this.c + this.tx); + this.set_ty(inPos.x * this.b + inPos.y * this.d + this.ty); + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); } - ,inflate: function(dx,dy) { - this.x -= dx; - this.width += dx * 2; - this.y -= dy; - this.height += dy * 2; + ,__transformY: function(inPos) { + return inPos.x * this.b + inPos.y * this.d + this.ty; } - ,extendBounds: function(r) { - var dx = this.x - r.x; - if(dx > 0) { - this.x -= dx; - this.width += dx; - } - var dy = this.y - r.y; - if(dy > 0) { - this.y -= dy; - this.height += dy; - } - if(r.get_right() > this.get_right()) this.set_right(r.get_right()); - if(r.get_bottom() > this.get_bottom()) this.set_bottom(r.get_bottom()); + ,__transformX: function(inPos) { + return inPos.x * this.a + inPos.y * this.c + this.tx; } - ,equals: function(toCompare) { - return this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height; + ,translate: function(inDX,inDY) { + var m = new flash.geom.Matrix(); + m.set_tx(inDX); + m.set_ty(inDY); + this.concat(m); } - ,containsRect: function(rect) { - if(rect.width <= 0 || rect.height <= 0) return rect.x > this.x && rect.y > this.y && rect.get_right() < this.get_right() && rect.get_bottom() < this.get_bottom(); else return rect.x >= this.x && rect.y >= this.y && rect.get_right() <= this.get_right() && rect.get_bottom() <= this.get_bottom(); + ,transformPoint: function(inPos) { + return new flash.geom.Point(inPos.x * this.a + inPos.y * this.c + this.tx,inPos.x * this.b + inPos.y * this.d + this.ty); } - ,containsPoint: function(point) { - return this.contains(point.x,point.y); + ,toString: function() { + return "matrix(" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.tx + ", " + this.ty + ")"; } - ,contains: function(inX,inY) { - return inX >= this.x && inY >= this.y && inX < this.get_right() && inY < this.get_bottom(); + ,toMozString: function() { + return "matrix(" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.tx + "px, " + this.ty + "px)"; } - ,clone: function() { - return new flash.geom.Rectangle(this.x,this.y,this.width,this.height); + ,to3DString: function() { + return "matrix3d(" + this.a + ", " + this.b + ", " + "0, 0, " + this.c + ", " + this.d + ", " + "0, 0, 0, 0, 1, 0, " + this.tx + ", " + this.ty + ", " + "0, 1" + ")"; } - ,__class__: flash.geom.Rectangle - ,__properties__: {set_bottom:"set_bottom",get_bottom:"get_bottom",set_bottomRight:"set_bottomRight",get_bottomRight:"get_bottomRight",set_left:"set_left",get_left:"get_left",set_right:"set_right",get_right:"get_right",set_size:"set_size",get_size:"get_size",set_top:"set_top",get_top:"get_top",set_topLeft:"set_topLeft",get_topLeft:"get_topLeft"} -} -flash.geom.Transform = function(displayObject) { - if(displayObject == null) throw "Cannot create Transform with no DisplayObject."; - this._displayObject = displayObject; - this._matrix = new flash.geom.Matrix(); - this._fullMatrix = new flash.geom.Matrix(); - this.set_colorTransform(new flash.geom.ColorTransform()); -}; -$hxClasses["flash.geom.Transform"] = flash.geom.Transform; -flash.geom.Transform.__name__ = ["flash","geom","Transform"]; -flash.geom.Transform.prototype = { - get_pixelBounds: function() { - return this._displayObject.getBounds(null); + ,setRotation: function(inTheta,inScale) { + if(inScale == null) inScale = 1; + var scale = inScale; + this.a = Math.cos(inTheta) * scale; + this.c = Math.sin(inTheta) * scale; + this.b = -this.c; + this.d = this.a; + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); } - ,set_matrix: function(inValue) { - this._matrix.copy(inValue); - this._displayObject.__matrixOverridden(); - return this._matrix; + ,scale: function(inSX,inSY) { + this._sx = inSX; + this._sy = inSY; + this.a *= inSX; + this.b *= inSY; + this.c *= inSX; + this.d *= inSY; + var _g = this; + _g.set_tx(_g.tx * inSX); + var _g = this; + _g.set_ty(_g.ty * inSY); + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); } - ,get_matrix: function() { - return this._matrix.clone(); + ,rotate: function(inTheta) { + var cos = Math.cos(inTheta); + var sin = Math.sin(inTheta); + var a1 = this.a * cos - this.b * sin; + this.b = this.a * sin + this.b * cos; + this.a = a1; + var c1 = this.c * cos - this.d * sin; + this.d = this.c * sin + this.d * cos; + this.c = c1; + var tx1 = this.tx * cos - this.ty * sin; + this.set_ty(this.tx * sin + this.ty * cos); + this.set_tx(tx1); + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); } - ,get_concatenatedMatrix: function() { - return this.__getFullMatrix(this._matrix); + ,mult: function(m) { + var result = this.clone(); + result.concat(m); + return result; + } + ,invert: function() { + var norm = this.a * this.d - this.b * this.c; + if(norm == 0) { + this.a = this.b = this.c = this.d = 0; + this.set_tx(-this.tx); + this.set_ty(-this.ty); + } else { + norm = 1.0 / norm; + var a1 = this.d * norm; + this.d = this.a * norm; + this.a = a1; + this.b *= -norm; + this.c *= -norm; + var tx1 = -this.a * this.tx - this.c * this.ty; + this.set_ty(-this.b * this.tx - this.d * this.ty); + this.set_tx(tx1); + } + this._sx /= this._sx; + this._sy /= this._sy; + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); + return this; + } + ,identity: function() { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.set_tx(0); + this.set_ty(0); + this._sx = 1.0; + this._sy = 1.0; } - ,set_colorTransform: function(inValue) { - this.colorTransform = inValue; - return inValue; + ,createGradientBox: function(in_width,in_height,rotation,in_tx,in_ty) { + if(in_ty == null) in_ty = 0; + if(in_tx == null) in_tx = 0; + if(rotation == null) rotation = 0; + this.a = in_width / 1638.4; + this.d = in_height / 1638.4; + if(rotation != null && rotation != 0.0) { + var cos = Math.cos(rotation); + var sin = Math.sin(rotation); + this.b = sin * this.d; + this.c = -sin * this.a; + this.a *= cos; + this.d *= cos; + } else { + this.b = 0; + this.c = 0; + } + this.set_tx(in_tx != null?in_tx + in_width / 2:in_width / 2); + this.set_ty(in_ty != null?in_ty + in_height / 2:in_height / 2); } - ,__setMatrix: function(inValue) { - this._matrix.copy(inValue); + ,copy: function(m) { + this.a = m.a; + this.b = m.b; + this.c = m.c; + this.d = m.d; + this.set_tx(m.tx); + this.set_ty(m.ty); + this._sx = m._sx; + this._sy = m._sy; } - ,__setFullMatrix: function(inValue) { - this._fullMatrix.copy(inValue); - return this._fullMatrix; + ,concat: function(m) { + var a1 = this.a * m.a + this.b * m.c; + this.b = this.a * m.b + this.b * m.d; + this.a = a1; + var c1 = this.c * m.a + this.d * m.c; + this.d = this.c * m.b + this.d * m.d; + this.c = c1; + var tx1 = this.tx * m.a + this.ty * m.c + m.tx; + this.set_ty(this.tx * m.b + this.ty * m.d + m.ty); + this.set_tx(tx1); + this._sx *= m._sx; + this._sy *= m._sy; + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); } - ,__getFullMatrix: function(localMatrix) { - var m; - if(localMatrix != null) m = localMatrix.mult(this._fullMatrix); else m = this._fullMatrix.clone(); + ,clone: function() { + var m = new flash.geom.Matrix(this.a,this.b,this.c,this.d,this.tx,this.ty); + m._sx = this._sx; + m._sy = this._sy; return m; } - ,__class__: flash.geom.Transform - ,__properties__: {set_colorTransform:"set_colorTransform",get_concatenatedMatrix:"get_concatenatedMatrix",set_matrix:"set_matrix",get_matrix:"get_matrix",get_pixelBounds:"get_pixelBounds"} + ,cleanValues: function() { + this.a = Math.round(this.a * 1000) / 1000; + this.b = Math.round(this.b * 1000) / 1000; + this.c = Math.round(this.c * 1000) / 1000; + this.d = Math.round(this.d * 1000) / 1000; + this.set_tx(Math.round(this.tx * 10) / 10); + this.set_ty(Math.round(this.ty * 10) / 10); + } + ,__class__: flash.geom.Matrix + ,__properties__: {set_tx:"set_tx",set_ty:"set_ty"} } -flash.geom.Vector3D = function(x,y,z,w) { - if(w == null) w = 0.; - if(z == null) z = 0.; - if(y == null) y = 0.; - if(x == null) x = 0.; - this.w = w; - this.x = x; - this.y = y; - this.z = z; +flash.geom.Matrix3D = function(v) { + if(v != null && flash._Vector.Vector_Impl_.get_length(v) == 16) this.rawData = v; else this.rawData = [1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0]; }; -$hxClasses["flash.geom.Vector3D"] = flash.geom.Vector3D; -flash.geom.Vector3D.__name__ = ["flash","geom","Vector3D"]; -flash.geom.Vector3D.__properties__ = {get_Z_AXIS:"get_Z_AXIS",get_Y_AXIS:"get_Y_AXIS",get_X_AXIS:"get_X_AXIS"} -flash.geom.Vector3D.angleBetween = function(a,b) { - var a0 = new flash.geom.Vector3D(a.x,a.y,a.z,a.w); - a0.normalize(); - var b0 = new flash.geom.Vector3D(b.x,b.y,b.z,b.w); - b0.normalize(); - return Math.acos(a0.x * b0.x + a0.y * b0.y + a0.z * b0.z); +$hxClasses["flash.geom.Matrix3D"] = flash.geom.Matrix3D; +flash.geom.Matrix3D.__name__ = ["flash","geom","Matrix3D"]; +flash.geom.Matrix3D.create2D = function(x,y,scale,rotation) { + if(rotation == null) rotation = 0; + if(scale == null) scale = 1; + var theta = rotation * Math.PI / 180.0; + var c = Math.cos(theta); + var s = Math.sin(theta); + return new flash.geom.Matrix3D([c * scale,-s * scale,0,0,s * scale,c * scale,0,0,0,0,1,0,x,y,0,1]); } -flash.geom.Vector3D.distance = function(pt1,pt2) { - var x = pt2.x - pt1.x; - var y = pt2.y - pt1.y; - var z = pt2.z - pt1.z; - return Math.sqrt(x * x + y * y + z * z); +flash.geom.Matrix3D.createABCD = function(a,b,c,d,tx,ty) { + return new flash.geom.Matrix3D([a,b,0,0,c,d,0,0,0,0,1,0,tx,ty,0,1]); } -flash.geom.Vector3D.get_X_AXIS = function() { - return new flash.geom.Vector3D(1,0,0); +flash.geom.Matrix3D.createOrtho = function(x0,x1,y0,y1,zNear,zFar) { + var sx = 1.0 / (x1 - x0); + var sy = 1.0 / (y1 - y0); + var sz = 1.0 / (zFar - zNear); + return new flash.geom.Matrix3D([2.0 * sx,0,0,0,0,2.0 * sy,0,0,0,0,-2. * sz,0,-(x0 + x1) * sx,-(y0 + y1) * sy,-(zNear + zFar) * sz,1]); } -flash.geom.Vector3D.get_Y_AXIS = function() { - return new flash.geom.Vector3D(0,1,0); +flash.geom.Matrix3D.getAxisRotation = function(x,y,z,degrees) { + var m = new flash.geom.Matrix3D(); + var a1 = new flash.geom.Vector3D(x,y,z); + var rad = -degrees * (Math.PI / 180); + var c = Math.cos(rad); + var s = Math.sin(rad); + var t = 1.0 - c; + m.rawData[0] = c + a1.x * a1.x * t; + m.rawData[5] = c + a1.y * a1.y * t; + m.rawData[10] = c + a1.z * a1.z * t; + var tmp1 = a1.x * a1.y * t; + var tmp2 = a1.z * s; + m.rawData[4] = tmp1 + tmp2; + m.rawData[1] = tmp1 - tmp2; + tmp1 = a1.x * a1.z * t; + tmp2 = a1.y * s; + m.rawData[8] = tmp1 - tmp2; + m.rawData[2] = tmp1 + tmp2; + tmp1 = a1.y * a1.z * t; + tmp2 = a1.x * s; + m.rawData[9] = tmp1 + tmp2; + m.rawData[6] = tmp1 - tmp2; + return m; } -flash.geom.Vector3D.get_Z_AXIS = function() { - return new flash.geom.Vector3D(0,0,1); +flash.geom.Matrix3D.interpolate = function(thisMat,toMat,percent) { + var m = new flash.geom.Matrix3D(); + var _g = 0; + while(_g < 16) { + var i = _g++; + m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i]) * percent; + } + return m; } -flash.geom.Vector3D.prototype = { - get_lengthSquared: function() { - return this.x * this.x + this.y * this.y + this.z * this.z; +flash.geom.Matrix3D.prototype = { + set_position: function(val) { + this.rawData[12] = val.x; + this.rawData[13] = val.y; + this.rawData[14] = val.z; + return val; } - ,get_length: function() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + ,get_position: function() { + return new flash.geom.Vector3D(this.rawData[12],this.rawData[13],this.rawData[14]); } - ,toString: function() { - return "Vector3D(" + this.x + ", " + this.y + ", " + this.z + ")"; + ,get_determinant: function() { + return -1 * ((this.rawData[0] * this.rawData[5] - this.rawData[4] * this.rawData[1]) * (this.rawData[10] * this.rawData[15] - this.rawData[14] * this.rawData[11]) - (this.rawData[0] * this.rawData[9] - this.rawData[8] * this.rawData[1]) * (this.rawData[6] * this.rawData[15] - this.rawData[14] * this.rawData[7]) + (this.rawData[0] * this.rawData[13] - this.rawData[12] * this.rawData[1]) * (this.rawData[6] * this.rawData[11] - this.rawData[10] * this.rawData[7]) + (this.rawData[4] * this.rawData[9] - this.rawData[8] * this.rawData[5]) * (this.rawData[2] * this.rawData[15] - this.rawData[14] * this.rawData[3]) - (this.rawData[4] * this.rawData[13] - this.rawData[12] * this.rawData[5]) * (this.rawData[2] * this.rawData[11] - this.rawData[10] * this.rawData[3]) + (this.rawData[8] * this.rawData[13] - this.rawData[12] * this.rawData[9]) * (this.rawData[2] * this.rawData[7] - this.rawData[6] * this.rawData[3])); } - ,subtract: function(a) { - return new flash.geom.Vector3D(this.x - a.x,this.y - a.y,this.z - a.z); + ,transpose: function() { + var oRawData = flash._Vector.Vector_Impl_.copy(this.rawData); + this.rawData[1] = oRawData[4]; + this.rawData[2] = oRawData[8]; + this.rawData[3] = oRawData[12]; + this.rawData[4] = oRawData[1]; + this.rawData[6] = oRawData[9]; + this.rawData[7] = oRawData[13]; + this.rawData[8] = oRawData[2]; + this.rawData[9] = oRawData[6]; + this.rawData[11] = oRawData[14]; + this.rawData[12] = oRawData[3]; + this.rawData[13] = oRawData[7]; + this.rawData[14] = oRawData[11]; } - ,scaleBy: function(s) { - this.x *= s; - this.y *= s; - this.z *= s; + ,transformVectors: function(vin,vout) { + var i = 0; + while(i + 3 <= flash._Vector.Vector_Impl_.get_length(vin)) { + var x = vin[i], y = vin[i + 1], z = vin[i + 2]; + vout[i] = x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8] + this.rawData[12]; + vout[i + 1] = x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9] + this.rawData[13]; + vout[i + 2] = x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10] + this.rawData[14]; + i += 3; + } + } + ,transformVector: function(v) { + var x = v.x, y = v.y, z = v.z; + return new flash.geom.Vector3D(x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8] + this.rawData[12],x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9] + this.rawData[13],x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10] + this.rawData[14],1); + } + ,recompose: function(components) { + if(flash._Vector.Vector_Impl_.get_length(components) < 3 || components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; + this.rawData[0] = 1; + this.rawData[1] = 0; + this.rawData[2] = 0; + this.rawData[3] = 0; + this.rawData[4] = 0; + this.rawData[5] = 1; + this.rawData[6] = 0; + this.rawData[7] = 0; + this.rawData[8] = 0; + this.rawData[9] = 0; + this.rawData[10] = 1; + this.rawData[11] = 0; + this.rawData[12] = 0; + this.rawData[13] = 0; + this.rawData[14] = 0; + this.rawData[15] = 1; + this.append(new flash.geom.Matrix3D([components[2].x,0.0,0.0,0.0,0.0,components[2].y,0.0,0.0,0.0,0.0,components[2].z,0.0,0.0,0.0,0.0,1.0])); + var angle; + angle = -components[1].x; + this.append(new flash.geom.Matrix3D([1,0,0,0,0,Math.cos(angle),-Math.sin(angle),0,0,Math.sin(angle),Math.cos(angle),0,0,0,0,0])); + angle = -components[1].y; + this.append(new flash.geom.Matrix3D([Math.cos(angle),0,Math.sin(angle),0,0,1,0,0,-Math.sin(angle),0,Math.cos(angle),0,0,0,0,0])); + angle = -components[1].z; + this.append(new flash.geom.Matrix3D([Math.cos(angle),-Math.sin(angle),0,0,Math.sin(angle),Math.cos(angle),0,0,0,0,1,0,0,0,0,0])); + this.set_position(components[0]); + this.rawData[15] = 1; + return true; + } + ,prependTranslation: function(x,y,z) { + var m = new flash.geom.Matrix3D(); + m.set_position(new flash.geom.Vector3D(x,y,z)); + this.prepend(m); + } + ,prependScale: function(xScale,yScale,zScale) { + this.prepend(new flash.geom.Matrix3D([xScale,0.0,0.0,0.0,0.0,yScale,0.0,0.0,0.0,0.0,zScale,0.0,0.0,0.0,0.0,1.0])); + } + ,prependRotation: function(degrees,axis,pivotPoint) { + var m = flash.geom.Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees); + if(pivotPoint != null) { + var p = pivotPoint; + m.rawData[12] += p.x; + m.rawData[13] += p.y; + m.rawData[14] += p.z; + } + this.prepend(m); } - ,project: function() { - this.x /= this.w; - this.y /= this.w; - this.z /= this.w; + ,prepend: function(rhs) { + var m111 = rhs.rawData[0], m121 = rhs.rawData[4], m131 = rhs.rawData[8], m141 = rhs.rawData[12], m112 = rhs.rawData[1], m122 = rhs.rawData[5], m132 = rhs.rawData[9], m142 = rhs.rawData[13], m113 = rhs.rawData[2], m123 = rhs.rawData[6], m133 = rhs.rawData[10], m143 = rhs.rawData[14], m114 = rhs.rawData[3], m124 = rhs.rawData[7], m134 = rhs.rawData[11], m144 = rhs.rawData[15], m211 = this.rawData[0], m221 = this.rawData[4], m231 = this.rawData[8], m241 = this.rawData[12], m212 = this.rawData[1], m222 = this.rawData[5], m232 = this.rawData[9], m242 = this.rawData[13], m213 = this.rawData[2], m223 = this.rawData[6], m233 = this.rawData[10], m243 = this.rawData[14], m214 = this.rawData[3], m224 = this.rawData[7], m234 = this.rawData[11], m244 = this.rawData[15]; + this.rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; + this.rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; + this.rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; + this.rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; + this.rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; + this.rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; + this.rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; + this.rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; + this.rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; + this.rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; + this.rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; + this.rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; + this.rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; + this.rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; + this.rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; + this.rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; } - ,normalize: function() { - var l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - if(l != 0) { - this.x /= l; - this.y /= l; - this.z /= l; + ,invert: function() { + var d = -1 * ((this.rawData[0] * this.rawData[5] - this.rawData[4] * this.rawData[1]) * (this.rawData[10] * this.rawData[15] - this.rawData[14] * this.rawData[11]) - (this.rawData[0] * this.rawData[9] - this.rawData[8] * this.rawData[1]) * (this.rawData[6] * this.rawData[15] - this.rawData[14] * this.rawData[7]) + (this.rawData[0] * this.rawData[13] - this.rawData[12] * this.rawData[1]) * (this.rawData[6] * this.rawData[11] - this.rawData[10] * this.rawData[7]) + (this.rawData[4] * this.rawData[9] - this.rawData[8] * this.rawData[5]) * (this.rawData[2] * this.rawData[15] - this.rawData[14] * this.rawData[3]) - (this.rawData[4] * this.rawData[13] - this.rawData[12] * this.rawData[5]) * (this.rawData[2] * this.rawData[11] - this.rawData[10] * this.rawData[3]) + (this.rawData[8] * this.rawData[13] - this.rawData[12] * this.rawData[9]) * (this.rawData[2] * this.rawData[7] - this.rawData[6] * this.rawData[3])); + var invertable = Math.abs(d) > 0.00000000001; + if(invertable) { + d = -1 / d; + var m11 = this.rawData[0]; + var m21 = this.rawData[4]; + var m31 = this.rawData[8]; + var m41 = this.rawData[12]; + var m12 = this.rawData[1]; + var m22 = this.rawData[5]; + var m32 = this.rawData[9]; + var m42 = this.rawData[13]; + var m13 = this.rawData[2]; + var m23 = this.rawData[6]; + var m33 = this.rawData[10]; + var m43 = this.rawData[14]; + var m14 = this.rawData[3]; + var m24 = this.rawData[7]; + var m34 = this.rawData[11]; + var m44 = this.rawData[15]; + this.rawData[0] = d * (m22 * (m33 * m44 - m43 * m34) - m32 * (m23 * m44 - m43 * m24) + m42 * (m23 * m34 - m33 * m24)); + this.rawData[1] = -d * (m12 * (m33 * m44 - m43 * m34) - m32 * (m13 * m44 - m43 * m14) + m42 * (m13 * m34 - m33 * m14)); + this.rawData[2] = d * (m12 * (m23 * m44 - m43 * m24) - m22 * (m13 * m44 - m43 * m14) + m42 * (m13 * m24 - m23 * m14)); + this.rawData[3] = -d * (m12 * (m23 * m34 - m33 * m24) - m22 * (m13 * m34 - m33 * m14) + m32 * (m13 * m24 - m23 * m14)); + this.rawData[4] = -d * (m21 * (m33 * m44 - m43 * m34) - m31 * (m23 * m44 - m43 * m24) + m41 * (m23 * m34 - m33 * m24)); + this.rawData[5] = d * (m11 * (m33 * m44 - m43 * m34) - m31 * (m13 * m44 - m43 * m14) + m41 * (m13 * m34 - m33 * m14)); + this.rawData[6] = -d * (m11 * (m23 * m44 - m43 * m24) - m21 * (m13 * m44 - m43 * m14) + m41 * (m13 * m24 - m23 * m14)); + this.rawData[7] = d * (m11 * (m23 * m34 - m33 * m24) - m21 * (m13 * m34 - m33 * m14) + m31 * (m13 * m24 - m23 * m14)); + this.rawData[8] = d * (m21 * (m32 * m44 - m42 * m34) - m31 * (m22 * m44 - m42 * m24) + m41 * (m22 * m34 - m32 * m24)); + this.rawData[9] = -d * (m11 * (m32 * m44 - m42 * m34) - m31 * (m12 * m44 - m42 * m14) + m41 * (m12 * m34 - m32 * m14)); + this.rawData[10] = d * (m11 * (m22 * m44 - m42 * m24) - m21 * (m12 * m44 - m42 * m14) + m41 * (m12 * m24 - m22 * m14)); + this.rawData[11] = -d * (m11 * (m22 * m34 - m32 * m24) - m21 * (m12 * m34 - m32 * m14) + m31 * (m12 * m24 - m22 * m14)); + this.rawData[12] = -d * (m21 * (m32 * m43 - m42 * m33) - m31 * (m22 * m43 - m42 * m23) + m41 * (m22 * m33 - m32 * m23)); + this.rawData[13] = d * (m11 * (m32 * m43 - m42 * m33) - m31 * (m12 * m43 - m42 * m13) + m41 * (m12 * m33 - m32 * m13)); + this.rawData[14] = -d * (m11 * (m22 * m43 - m42 * m23) - m21 * (m12 * m43 - m42 * m13) + m41 * (m12 * m23 - m22 * m13)); + this.rawData[15] = d * (m11 * (m22 * m33 - m32 * m23) - m21 * (m12 * m33 - m32 * m13) + m31 * (m12 * m23 - m22 * m13)); } - return l; + return invertable; } - ,negate: function() { - this.x *= -1; - this.y *= -1; - this.z *= -1; + ,interpolateTo: function(toMat,percent) { + var _g = 0; + while(_g < 16) { + var i = _g++; + this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i]) * percent; + } } - ,nearEquals: function(toCompare,tolerance,allFour) { - if(allFour == null) allFour = false; - return Math.abs(this.x - toCompare.x) < tolerance && Math.abs(this.y - toCompare.y) < tolerance && Math.abs(this.z - toCompare.z) < tolerance && (!allFour || Math.abs(this.w - toCompare.w) < tolerance); + ,identity: function() { + this.rawData[0] = 1; + this.rawData[1] = 0; + this.rawData[2] = 0; + this.rawData[3] = 0; + this.rawData[4] = 0; + this.rawData[5] = 1; + this.rawData[6] = 0; + this.rawData[7] = 0; + this.rawData[8] = 0; + this.rawData[9] = 0; + this.rawData[10] = 1; + this.rawData[11] = 0; + this.rawData[12] = 0; + this.rawData[13] = 0; + this.rawData[14] = 0; + this.rawData[15] = 1; } - ,incrementBy: function(a) { - this.x += a.x; - this.y += a.y; - this.z += a.z; + ,deltaTransformVector: function(v) { + var x = v.x; + var y = v.y; + var z = v.z; + return new flash.geom.Vector3D(x * this.rawData[0] + y * this.rawData[1] + z * this.rawData[2] + this.rawData[3],x * this.rawData[4] + y * this.rawData[5] + z * this.rawData[6] + this.rawData[7],x * this.rawData[8] + y * this.rawData[9] + z * this.rawData[10] + this.rawData[11],0); } - ,equals: function(toCompare,allFour) { - if(allFour == null) allFour = false; - return this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w); + ,decompose: function() { + var vec = flash._Vector.Vector_Impl_._new(); + var m = new flash.geom.Matrix3D(flash._Vector.Vector_Impl_.copy(this.rawData)); + var mr = m.rawData; + var pos = new flash.geom.Vector3D(mr[12],mr[13],mr[14]); + mr[12] = 0; + mr[13] = 0; + mr[14] = 0; + var scale = new flash.geom.Vector3D(); + scale.x = Math.sqrt(mr[0] * mr[0] + mr[1] * mr[1] + mr[2] * mr[2]); + scale.y = Math.sqrt(mr[4] * mr[4] + mr[5] * mr[5] + mr[6] * mr[6]); + scale.z = Math.sqrt(mr[8] * mr[8] + mr[9] * mr[9] + mr[10] * mr[10]); + if(mr[0] * (mr[5] * mr[10] - mr[6] * mr[9]) - mr[1] * (mr[4] * mr[10] - mr[6] * mr[8]) + mr[2] * (mr[4] * mr[9] - mr[5] * mr[8]) < 0) scale.z = -scale.z; + mr[0] /= scale.x; + mr[1] /= scale.x; + mr[2] /= scale.x; + mr[4] /= scale.y; + mr[5] /= scale.y; + mr[6] /= scale.y; + mr[8] /= scale.z; + mr[9] /= scale.z; + mr[10] /= scale.z; + var rot = new flash.geom.Vector3D(); + rot.y = Math.asin(-mr[2]); + var C = Math.cos(rot.y); + if(C > 0) { + rot.x = Math.atan2(mr[6],mr[10]); + rot.z = Math.atan2(mr[1],mr[0]); + } else { + rot.z = 0; + rot.x = Math.atan2(mr[4],mr[5]); + } + flash._Vector.Vector_Impl_.push(vec,pos); + flash._Vector.Vector_Impl_.push(vec,rot); + flash._Vector.Vector_Impl_.push(vec,scale); + return vec; } - ,dotProduct: function(a) { - return this.x * a.x + this.y * a.y + this.z * a.z; + ,copyFrom: function(other) { + var _g = 0; + while(_g < 16) { + var i = _g++; + this.rawData[i] = other.rawData[i]; + } } - ,decrementBy: function(a) { - this.x -= a.x; - this.y -= a.y; - this.z -= a.z; + ,clone: function() { + return new flash.geom.Matrix3D(flash._Vector.Vector_Impl_.copy(this.rawData)); } - ,crossProduct: function(a) { - return new flash.geom.Vector3D(this.y * a.z - this.z * a.y,this.z * a.x - this.x * a.z,this.x * a.y - this.y * a.x,1); + ,appendTranslation: function(x,y,z) { + this.rawData[12] += x; + this.rawData[13] += y; + this.rawData[14] += z; } - ,clone: function() { - return new flash.geom.Vector3D(this.x,this.y,this.z,this.w); + ,appendScale: function(xScale,yScale,zScale) { + this.append(new flash.geom.Matrix3D([xScale,0.0,0.0,0.0,0.0,yScale,0.0,0.0,0.0,0.0,zScale,0.0,0.0,0.0,0.0,1.0])); } - ,add: function(a) { - return new flash.geom.Vector3D(this.x + a.x,this.y + a.y,this.z + a.z); + ,appendRotation: function(degrees,axis,pivotPoint) { + var m = flash.geom.Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees); + if(pivotPoint != null) { + var p = pivotPoint; + m.rawData[12] += p.x; + m.rawData[13] += p.y; + m.rawData[14] += p.z; + } + this.append(m); } - ,__class__: flash.geom.Vector3D - ,__properties__: {get_length:"get_length",get_lengthSquared:"get_lengthSquared"} + ,append: function(lhs) { + var m111 = this.rawData[0], m121 = this.rawData[4], m131 = this.rawData[8], m141 = this.rawData[12], m112 = this.rawData[1], m122 = this.rawData[5], m132 = this.rawData[9], m142 = this.rawData[13], m113 = this.rawData[2], m123 = this.rawData[6], m133 = this.rawData[10], m143 = this.rawData[14], m114 = this.rawData[3], m124 = this.rawData[7], m134 = this.rawData[11], m144 = this.rawData[15], m211 = lhs.rawData[0], m221 = lhs.rawData[4], m231 = lhs.rawData[8], m241 = lhs.rawData[12], m212 = lhs.rawData[1], m222 = lhs.rawData[5], m232 = lhs.rawData[9], m242 = lhs.rawData[13], m213 = lhs.rawData[2], m223 = lhs.rawData[6], m233 = lhs.rawData[10], m243 = lhs.rawData[14], m214 = lhs.rawData[3], m224 = lhs.rawData[7], m234 = lhs.rawData[11], m244 = lhs.rawData[15]; + this.rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; + this.rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; + this.rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; + this.rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; + this.rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; + this.rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; + this.rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; + this.rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; + this.rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; + this.rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; + this.rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; + this.rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; + this.rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; + this.rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; + this.rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; + this.rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; + } + ,__class__: flash.geom.Matrix3D + ,__properties__: {get_determinant:"get_determinant",set_position:"set_position",get_position:"get_position"} } -flash.media = {} -flash.media.Sound = function(stream,context) { - flash.events.EventDispatcher.call(this,this); - this.bytesLoaded = 0; - this.bytesTotal = 0; - this.id3 = null; - this.isBuffering = false; - this.length = 0; - this.url = null; - this.__soundChannels = new haxe.ds.IntMap(); - this.__soundIdx = 0; - if(stream != null) this.load(stream,context); +flash.geom.Point = function(inX,inY) { + if(inY == null) inY = 0; + if(inX == null) inX = 0; + this.x = inX; + this.y = inY; }; -$hxClasses["flash.media.Sound"] = flash.media.Sound; -flash.media.Sound.__name__ = ["flash","media","Sound"]; -flash.media.Sound.__canPlayMime = function(mime) { - var audio = js.Browser.document.createElement("audio"); - var playable = function(ok) { - if(ok != "" && ok != "no") return true; else return false; - }; - return playable(audio.canPlayType(mime,null)); -} -flash.media.Sound.__canPlayType = function(extension) { - var mime = flash.media.Sound.__mimeForExtension(extension); - if(mime == null) return false; - return flash.media.Sound.__canPlayMime(mime); -} -flash.media.Sound.__mimeForExtension = function(extension) { - var mime = null; - switch(extension) { - case "mp3": - mime = "audio/mpeg"; - break; - case "ogg": - mime = "audio/ogg; codecs=\"vorbis\""; - break; - case "wav": - mime = "audio/wav; codecs=\"1\""; - break; - case "aac": - mime = "audio/mp4; codecs=\"mp4a.40.2\""; - break; - default: - mime = null; - } - return mime; +$hxClasses["flash.geom.Point"] = flash.geom.Point; +flash.geom.Point.__name__ = ["flash","geom","Point"]; +flash.geom.Point.distance = function(pt1,pt2) { + var dx = pt1.x - pt2.x; + var dy = pt1.y - pt2.y; + return Math.sqrt(dx * dx + dy * dy); } -flash.media.Sound.__super__ = flash.events.EventDispatcher; -flash.media.Sound.prototype = $extend(flash.events.EventDispatcher.prototype,{ - __onSoundLoaded: function(evt) { - this.__removeEventListeners(); - var evt1 = new flash.events.Event(flash.events.Event.COMPLETE); - this.dispatchEvent(evt1); +flash.geom.Point.interpolate = function(pt1,pt2,f) { + return new flash.geom.Point(pt2.x + f * (pt1.x - pt2.x),pt2.y + f * (pt1.y - pt2.y)); +} +flash.geom.Point.polar = function(len,angle) { + return new flash.geom.Point(len * Math.cos(angle),len * Math.sin(angle)); +} +flash.geom.Point.prototype = { + get_length: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); } - ,__onSoundLoadError: function(evt) { - this.__removeEventListeners(); - var evt1 = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); - this.dispatchEvent(evt1); + ,subtract: function(v) { + return new flash.geom.Point(this.x - v.x,this.y - v.y); } - ,__removeEventListeners: function() { - this.__soundCache.removeEventListener(flash.events.Event.COMPLETE,$bind(this,this.__onSoundLoaded),false); - this.__soundCache.removeEventListener(flash.events.IOErrorEvent.IO_ERROR,$bind(this,this.__onSoundLoadError),false); + ,setTo: function(xa,ya) { + this.x = xa; + this.y = ya; } - ,__load: function(stream,context,mime) { - if(mime == null) mime = ""; - this.__streamUrl = stream.url; - try { - this.__soundCache = new flash.net.URLLoader(); - this.__addEventListeners(); - this.__soundCache.load(stream); - } catch( e ) { - } + ,offset: function(dx,dy) { + this.x += dx; + this.y += dy; } - ,__addEventListeners: function() { - this.__soundCache.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.__onSoundLoaded)); - this.__soundCache.addEventListener(flash.events.IOErrorEvent.IO_ERROR,$bind(this,this.__onSoundLoadError)); + ,normalize: function(thickness) { + if(this.x == 0 && this.y == 0) return; else { + var norm = thickness / Math.sqrt(this.x * this.x + this.y * this.y); + this.x *= norm; + this.y *= norm; + } } - ,play: function(startTime,loops,sndTransform) { - if(loops == null) loops = 0; - if(startTime == null) startTime = 0.0; - if(this.__streamUrl == null) return null; - var self = this; - var curIdx = this.__soundIdx; - var removeRef = function() { - self.__soundChannels.remove(curIdx); - }; - var channel = flash.media.SoundChannel.__create(this.__streamUrl,startTime,loops,sndTransform,removeRef); - this.__soundChannels.set(curIdx,channel); - this.__soundIdx++; - var audio = channel.__audio; - return channel; + ,equals: function(toCompare) { + return toCompare.x == this.x && toCompare.y == this.y; } - ,load: function(stream,context) { - this.__load(stream,context); + ,clone: function() { + return new flash.geom.Point(this.x,this.y); } - ,close: function() { + ,add: function(v) { + return new flash.geom.Point(v.x + this.x,v.y + this.y); } - ,__class__: flash.media.Sound -}); -flash.media.SoundChannel = function() { - flash.events.EventDispatcher.call(this,this); - this.ChannelId = -1; - this.leftPeak = 0.; - this.position = 0.; - this.rightPeak = 0.; - this.__audioCurrentLoop = 1; - this.__audioTotalLoops = 1; + ,__class__: flash.geom.Point + ,__properties__: {get_length:"get_length"} +} +flash.geom.Rectangle = function(inX,inY,inWidth,inHeight) { + if(inHeight == null) inHeight = 0; + if(inWidth == null) inWidth = 0; + if(inY == null) inY = 0; + if(inX == null) inX = 0; + this.x = inX; + this.y = inY; + this.width = inWidth; + this.height = inHeight; }; -$hxClasses["flash.media.SoundChannel"] = flash.media.SoundChannel; -flash.media.SoundChannel.__name__ = ["flash","media","SoundChannel"]; -flash.media.SoundChannel.__create = function(src,startTime,loops,sndTransform,removeRef) { - if(loops == null) loops = 0; - if(startTime == null) startTime = 0.0; - var channel = new flash.media.SoundChannel(); - channel.__audio = js.Browser.document.createElement("audio"); - channel.__removeRef = removeRef; - channel.__audio.addEventListener("ended",$bind(channel,channel.__onSoundChannelFinished),false); - channel.__audio.addEventListener("seeked",$bind(channel,channel.__onSoundSeeked),false); - channel.__audio.addEventListener("stalled",$bind(channel,channel.__onStalled),false); - channel.__audio.addEventListener("progress",$bind(channel,channel.__onProgress),false); - if(loops > 0) { - channel.__audioTotalLoops = loops; - channel.__audio.loop = true; +$hxClasses["flash.geom.Rectangle"] = flash.geom.Rectangle; +flash.geom.Rectangle.__name__ = ["flash","geom","Rectangle"]; +flash.geom.Rectangle.prototype = { + set_topLeft: function(p) { + this.x = p.x; + this.y = p.y; + return p.clone(); } - channel.__startTime = startTime; - if(startTime > 0.) { - var onLoad = null; - onLoad = function(_) { - channel.__audio.currentTime = channel.__startTime; - channel.__audio.play(); - channel.__audio.removeEventListener("canplaythrough",onLoad,false); - }; - channel.__audio.addEventListener("canplaythrough",onLoad,false); - } else channel.__audio.autoplay = true; - channel.__audio.src = src; - return channel; -} -flash.media.SoundChannel.__super__ = flash.events.EventDispatcher; -flash.media.SoundChannel.prototype = $extend(flash.events.EventDispatcher.prototype,{ - set_soundTransform: function(v) { - this.__audio.volume = v.volume; - return this.soundTransform = v; + ,get_topLeft: function() { + return new flash.geom.Point(this.x,this.y); } - ,__onStalled: function(evt) { - if(this.__audio != null) this.__audio.load(); + ,set_top: function(t) { + this.height -= t - this.y; + this.y = t; + return t; } - ,__onSoundSeeked: function(evt) { - if(this.__audioCurrentLoop >= this.__audioTotalLoops) { - this.__audio.loop = false; - this.stop(); - } else this.__audioCurrentLoop++; + ,get_top: function() { + return this.y; } - ,__onSoundChannelFinished: function(evt) { - if(this.__audioCurrentLoop >= this.__audioTotalLoops) { - this.__audio.removeEventListener("ended",$bind(this,this.__onSoundChannelFinished),false); - this.__audio.removeEventListener("seeked",$bind(this,this.__onSoundSeeked),false); - this.__audio.removeEventListener("stalled",$bind(this,this.__onStalled),false); - this.__audio.removeEventListener("progress",$bind(this,this.__onProgress),false); - this.__audio = null; - var evt1 = new flash.events.Event(flash.events.Event.SOUND_COMPLETE); - evt1.target = this; - this.dispatchEvent(evt1); - if(this.__removeRef != null) this.__removeRef(); - } else { - this.__audio.currentTime = this.__startTime; - this.__audio.play(); - } + ,set_size: function(p) { + this.width = p.x; + this.height = p.y; + return p.clone(); } - ,__onProgress: function(evt) { + ,get_size: function() { + return new flash.geom.Point(this.width,this.height); } - ,stop: function() { - if(this.__audio != null) { - this.__audio.pause(); - this.__audio = null; - if(this.__removeRef != null) this.__removeRef(); - } + ,set_right: function(r) { + this.width = r - this.x; + return r; } - ,__class__: flash.media.SoundChannel - ,__properties__: {set_soundTransform:"set_soundTransform"} -}); -flash.media.SoundLoaderContext = function(bufferTime,checkPolicyFile) { - if(checkPolicyFile == null) checkPolicyFile = false; - if(bufferTime == null) bufferTime = 0; - this.bufferTime = bufferTime; - this.checkPolicyFile = checkPolicyFile; -}; -$hxClasses["flash.media.SoundLoaderContext"] = flash.media.SoundLoaderContext; -flash.media.SoundLoaderContext.__name__ = ["flash","media","SoundLoaderContext"]; -flash.media.SoundLoaderContext.prototype = { - __class__: flash.media.SoundLoaderContext -} -flash.media.SoundTransform = function(vol,panning) { - if(panning == null) panning = 0; - if(vol == null) vol = 1; - this.volume = vol; - this.pan = panning; - this.leftToLeft = 0; - this.leftToRight = 0; - this.rightToLeft = 0; - this.rightToRight = 0; -}; -$hxClasses["flash.media.SoundTransform"] = flash.media.SoundTransform; -flash.media.SoundTransform.__name__ = ["flash","media","SoundTransform"]; -flash.media.SoundTransform.prototype = { - __class__: flash.media.SoundTransform -} -flash.net = {} -flash.net.URLLoader = function(request) { - flash.events.EventDispatcher.call(this); - this.bytesLoaded = 0; - this.bytesTotal = 0; - this.set_dataFormat(flash.net.URLLoaderDataFormat.TEXT); - if(request != null) this.load(request); -}; -$hxClasses["flash.net.URLLoader"] = flash.net.URLLoader; -flash.net.URLLoader.__name__ = ["flash","net","URLLoader"]; -flash.net.URLLoader.__super__ = flash.events.EventDispatcher; -flash.net.URLLoader.prototype = $extend(flash.events.EventDispatcher.prototype,{ - set_dataFormat: function(inputVal) { - if(inputVal == flash.net.URLLoaderDataFormat.BINARY && !Reflect.hasField(js.Browser.window,"ArrayBuffer")) this.dataFormat = flash.net.URLLoaderDataFormat.TEXT; else this.dataFormat = inputVal; - return this.dataFormat; + ,get_right: function() { + return this.x + this.width; } - ,onStatus: function(status) { - var evt = new flash.events.HTTPStatusEvent(flash.events.HTTPStatusEvent.HTTP_STATUS,false,false,status); - evt.currentTarget = this; - this.dispatchEvent(evt); + ,set_left: function(l) { + this.width -= l - this.x; + this.x = l; + return l; } - ,onSecurityError: function(msg) { - var evt = new flash.events.SecurityErrorEvent(flash.events.SecurityErrorEvent.SECURITY_ERROR); - evt.text = msg; - evt.currentTarget = this; - this.dispatchEvent(evt); + ,get_left: function() { + return this.x; + } + ,set_bottomRight: function(p) { + this.width = p.x - this.x; + this.height = p.y - this.y; + return p.clone(); + } + ,get_bottomRight: function() { + return new flash.geom.Point(this.x + this.width,this.y + this.height); + } + ,set_bottom: function(b) { + this.height = b - this.y; + return b; } - ,onProgress: function(event) { - var evt = new flash.events.ProgressEvent(flash.events.ProgressEvent.PROGRESS); - evt.currentTarget = this; - evt.bytesLoaded = event.loaded; - evt.bytesTotal = event.total; - this.dispatchEvent(evt); + ,get_bottom: function() { + return this.y + this.height; } - ,onOpen: function() { - var evt = new flash.events.Event(flash.events.Event.OPEN); - evt.currentTarget = this; - this.dispatchEvent(evt); + ,union: function(toUnion) { + var x0 = this.x > toUnion.x?toUnion.x:this.x; + var x1 = this.get_right() < toUnion.get_right()?toUnion.get_right():this.get_right(); + var y0 = this.y > toUnion.y?toUnion.y:this.y; + var y1 = this.get_bottom() < toUnion.get_bottom()?toUnion.get_bottom():this.get_bottom(); + return new flash.geom.Rectangle(x0,y0,x1 - x0,y1 - y0); } - ,onError: function(msg) { - var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); - evt.text = msg; - evt.currentTarget = this; - this.dispatchEvent(evt); + ,transform: function(m) { + var tx0 = m.a * this.x + m.c * this.y; + var tx1 = tx0; + var ty0 = m.b * this.x + m.d * this.y; + var ty1 = tx0; + var tx = m.a * (this.x + this.width) + m.c * this.y; + var ty = m.b * (this.x + this.width) + m.d * this.y; + if(tx < tx0) tx0 = tx; + if(ty < ty0) ty0 = ty; + if(tx > tx1) tx1 = tx; + if(ty > ty1) ty1 = ty; + tx = m.a * (this.x + this.width) + m.c * (this.y + this.height); + ty = m.b * (this.x + this.width) + m.d * (this.y + this.height); + if(tx < tx0) tx0 = tx; + if(ty < ty0) ty0 = ty; + if(tx > tx1) tx1 = tx; + if(ty > ty1) ty1 = ty; + tx = m.a * this.x + m.c * (this.y + this.height); + ty = m.b * this.x + m.d * (this.y + this.height); + if(tx < tx0) tx0 = tx; + if(ty < ty0) ty0 = ty; + if(tx > tx1) tx1 = tx; + if(ty > ty1) ty1 = ty; + return new flash.geom.Rectangle(tx0 + m.tx,ty0 + m.ty,tx1 - tx0,ty1 - ty0); } - ,onData: function(_) { - var content = this.getData(); - var _g = this; - switch( (_g.dataFormat)[1] ) { - case 0: - this.data = flash.utils.ByteArray.__ofBuffer(content); - break; - default: - this.data = Std.string(content); - } - var evt = new flash.events.Event(flash.events.Event.COMPLETE); - evt.currentTarget = this; - this.dispatchEvent(evt); + ,setEmpty: function() { + this.x = this.y = this.width = this.height = 0; } - ,requestUrl: function(url,method,data,requestHeaders) { - var xmlHttpRequest = new XMLHttpRequest(); - this.registerEvents(xmlHttpRequest); - var uri = ""; - if(js.Boot.__instanceof(data,flash.utils.ByteArray)) { - var data1 = data; - var _g = this; - switch( (_g.dataFormat)[1] ) { - case 0: - uri = data1.data.buffer; - break; - default: - uri = data1.readUTFBytes(data1.length); - } - } else if(js.Boot.__instanceof(data,flash.net.URLVariables)) { - var data1 = data; - var _g = 0, _g1 = Reflect.fields(data1); - while(_g < _g1.length) { - var p = _g1[_g]; - ++_g; - if(uri.length != 0) uri += "&"; - uri += StringTools.urlEncode(p) + "=" + StringTools.urlEncode(Reflect.field(data1,p)); - } - } else if(data != null) uri = data.toString(); - try { - if(method == "GET" && uri != null && uri != "") { - var question = url.split("?").length <= 1; - xmlHttpRequest.open(method,url + (question?"?":"&") + Std.string(uri),true); - uri = ""; - } else xmlHttpRequest.open(method,url,true); - } catch( e ) { - this.onError(e.toString()); - return; - } - var _g = this; - switch( (_g.dataFormat)[1] ) { - case 0: - xmlHttpRequest.responseType = "arraybuffer"; - break; - default: - } - var _g1 = 0; - while(_g1 < requestHeaders.length) { - var header = requestHeaders[_g1]; - ++_g1; - xmlHttpRequest.setRequestHeader(header.name,header.value); - } - xmlHttpRequest.send(uri); - this.onOpen(); - this.getData = function() { - if(xmlHttpRequest.response != null) return xmlHttpRequest.response; else return xmlHttpRequest.responseText; - }; + ,offsetPoint: function(point) { + this.x += point.x; + this.y += point.y; } - ,registerEvents: function(subject) { - var self = this; - if(typeof XMLHttpRequestProgressEvent != "undefined") subject.addEventListener("progress",$bind(this,this.onProgress),false); - subject.onreadystatechange = function() { - if(subject.readyState != 4) return; - var s = (function($this) { - var $r; - try { - $r = subject.status; - } catch( e ) { - $r = null; - } - return $r; - }(this)); - if(s == undefined) s = null; - if(s != null) self.onStatus(s); - if(s != null && s >= 200 && s < 400) self.onData(subject.response); else if(s == null) self.onError("Failed to connect or resolve host"); else if(s == 12029) self.onError("Failed to connect to host"); else if(s == 12007) self.onError("Unknown host"); else if(s == 0) { - self.onError("Unable to make request (may be blocked due to cross-domain permissions)"); - self.onSecurityError("Unable to make request (may be blocked due to cross-domain permissions)"); - } else self.onError("Http Error #" + subject.status); - }; + ,offset: function(dx,dy) { + this.x += dx; + this.y += dy; } - ,load: function(request) { - this.requestUrl(request.url,request.method,request.data,request.formatRequestHeaders()); + ,isEmpty: function() { + return this.width <= 0 || this.height <= 0; } - ,getData: function() { - return null; + ,intersects: function(toIntersect) { + var x0 = this.x < toIntersect.x?toIntersect.x:this.x; + var x1 = this.get_right() > toIntersect.get_right()?toIntersect.get_right():this.get_right(); + if(x1 <= x0) return false; + var y0 = this.y < toIntersect.y?toIntersect.y:this.y; + var y1 = this.get_bottom() > toIntersect.get_bottom()?toIntersect.get_bottom():this.get_bottom(); + return y1 > y0; } - ,close: function() { + ,intersection: function(toIntersect) { + var x0 = this.x < toIntersect.x?toIntersect.x:this.x; + var x1 = this.get_right() > toIntersect.get_right()?toIntersect.get_right():this.get_right(); + if(x1 <= x0) return new flash.geom.Rectangle(); + var y0 = this.y < toIntersect.y?toIntersect.y:this.y; + var y1 = this.get_bottom() > toIntersect.get_bottom()?toIntersect.get_bottom():this.get_bottom(); + if(y1 <= y0) return new flash.geom.Rectangle(); + return new flash.geom.Rectangle(x0,y0,x1 - x0,y1 - y0); } - ,__class__: flash.net.URLLoader - ,__properties__: {set_dataFormat:"set_dataFormat"} -}); -flash.net.URLLoaderDataFormat = $hxClasses["flash.net.URLLoaderDataFormat"] = { __ename__ : true, __constructs__ : ["BINARY","TEXT","VARIABLES"] } -flash.net.URLLoaderDataFormat.BINARY = ["BINARY",0]; -flash.net.URLLoaderDataFormat.BINARY.toString = $estr; -flash.net.URLLoaderDataFormat.BINARY.__enum__ = flash.net.URLLoaderDataFormat; -flash.net.URLLoaderDataFormat.TEXT = ["TEXT",1]; -flash.net.URLLoaderDataFormat.TEXT.toString = $estr; -flash.net.URLLoaderDataFormat.TEXT.__enum__ = flash.net.URLLoaderDataFormat; -flash.net.URLLoaderDataFormat.VARIABLES = ["VARIABLES",2]; -flash.net.URLLoaderDataFormat.VARIABLES.toString = $estr; -flash.net.URLLoaderDataFormat.VARIABLES.__enum__ = flash.net.URLLoaderDataFormat; -flash.net.URLRequest = function(inURL) { - if(inURL != null) this.url = inURL; - this.requestHeaders = []; - this.method = flash.net.URLRequestMethod.GET; - this.contentType = null; -}; -$hxClasses["flash.net.URLRequest"] = flash.net.URLRequest; -flash.net.URLRequest.__name__ = ["flash","net","URLRequest"]; -flash.net.URLRequest.prototype = { - formatRequestHeaders: function() { - var res = this.requestHeaders; - if(res == null) res = []; - if(this.method == flash.net.URLRequestMethod.GET || this.data == null) return res; - if(js.Boot.__instanceof(this.data,String) || js.Boot.__instanceof(this.data,flash.utils.ByteArray)) { - res = res.slice(); - res.push(new flash.net.URLRequestHeader("Content-Type",this.contentType != null?this.contentType:"application/x-www-form-urlencoded")); - } - return res; + ,inflatePoint: function(point) { + this.inflate(point.x,point.y); } - ,__class__: flash.net.URLRequest -} -flash.net.URLRequestHeader = function(name,value) { - if(value == null) value = ""; - if(name == null) name = ""; - this.name = name; - this.value = value; -}; -$hxClasses["flash.net.URLRequestHeader"] = flash.net.URLRequestHeader; -flash.net.URLRequestHeader.__name__ = ["flash","net","URLRequestHeader"]; -flash.net.URLRequestHeader.prototype = { - __class__: flash.net.URLRequestHeader -} -flash.net.URLRequestMethod = function() { } -$hxClasses["flash.net.URLRequestMethod"] = flash.net.URLRequestMethod; -flash.net.URLRequestMethod.__name__ = ["flash","net","URLRequestMethod"]; -flash.net.URLVariables = function(inEncoded) { - if(inEncoded != null) this.decode(inEncoded); -}; -$hxClasses["flash.net.URLVariables"] = flash.net.URLVariables; -flash.net.URLVariables.__name__ = ["flash","net","URLVariables"]; -flash.net.URLVariables.prototype = { - toString: function() { - var result = new Array(); - var fields = Reflect.fields(this); - var _g = 0; - while(_g < fields.length) { - var f = fields[_g]; - ++_g; - result.push(StringTools.urlEncode(f) + "=" + StringTools.urlEncode(Reflect.field(this,f))); - } - return result.join("&"); + ,inflate: function(dx,dy) { + this.x -= dx; + this.width += dx * 2; + this.y -= dy; + this.height += dy * 2; } - ,decode: function(inVars) { - var fields = Reflect.fields(this); - var _g = 0; - while(_g < fields.length) { - var f = fields[_g]; - ++_g; - Reflect.deleteField(this,f); + ,extendBounds: function(r) { + var dx = this.x - r.x; + if(dx > 0) { + this.x -= dx; + this.width += dx; } - var fields1 = inVars.split(";").join("&").split("&"); - var _g = 0; - while(_g < fields1.length) { - var f = fields1[_g]; - ++_g; - var eq = f.indexOf("="); - if(eq > 0) this[StringTools.urlDecode(HxOverrides.substr(f,0,eq))] = StringTools.urlDecode(HxOverrides.substr(f,eq + 1,null)); else if(eq != 0) this[StringTools.urlDecode(f)] = ""; + var dy = this.y - r.y; + if(dy > 0) { + this.y -= dy; + this.height += dy; } + if(r.get_right() > this.get_right()) this.set_right(r.get_right()); + if(r.get_bottom() > this.get_bottom()) this.set_bottom(r.get_bottom()); } - ,__class__: flash.net.URLVariables -} -flash.system = {} -flash.system.ApplicationDomain = function(parentDomain) { - if(parentDomain != null) this.parentDomain = parentDomain; else this.parentDomain = flash.system.ApplicationDomain.currentDomain; -}; -$hxClasses["flash.system.ApplicationDomain"] = flash.system.ApplicationDomain; -flash.system.ApplicationDomain.__name__ = ["flash","system","ApplicationDomain"]; -flash.system.ApplicationDomain.prototype = { - hasDefinition: function(name) { - return Type.resolveClass(name) != null; + ,equals: function(toCompare) { + return this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height; } - ,getDefinition: function(name) { - return Type.resolveClass(name); + ,containsRect: function(rect) { + if(rect.width <= 0 || rect.height <= 0) return rect.x > this.x && rect.y > this.y && rect.get_right() < this.get_right() && rect.get_bottom() < this.get_bottom(); else return rect.x >= this.x && rect.y >= this.y && rect.get_right() <= this.get_right() && rect.get_bottom() <= this.get_bottom(); } - ,__class__: flash.system.ApplicationDomain -} -flash.system.LoaderContext = function(checkPolicyFile,applicationDomain,securityDomain) { - if(checkPolicyFile == null) checkPolicyFile = false; - this.checkPolicyFile = checkPolicyFile; - this.securityDomain = securityDomain; - if(applicationDomain != null) this.applicationDomain = applicationDomain; else this.applicationDomain = flash.system.ApplicationDomain.currentDomain; -}; -$hxClasses["flash.system.LoaderContext"] = flash.system.LoaderContext; -flash.system.LoaderContext.__name__ = ["flash","system","LoaderContext"]; -flash.system.LoaderContext.prototype = { - __class__: flash.system.LoaderContext + ,containsPoint: function(point) { + return this.contains(point.x,point.y); + } + ,contains: function(inX,inY) { + return inX >= this.x && inY >= this.y && inX < this.get_right() && inY < this.get_bottom(); + } + ,clone: function() { + return new flash.geom.Rectangle(this.x,this.y,this.width,this.height); + } + ,__class__: flash.geom.Rectangle + ,__properties__: {set_bottom:"set_bottom",get_bottom:"get_bottom",set_bottomRight:"set_bottomRight",get_bottomRight:"get_bottomRight",set_left:"set_left",get_left:"get_left",set_right:"set_right",get_right:"get_right",set_size:"set_size",get_size:"get_size",set_top:"set_top",get_top:"get_top",set_topLeft:"set_topLeft",get_topLeft:"get_topLeft"} } -flash.system.SecurityDomain = function() { +flash.geom.Transform = function(displayObject) { + if(displayObject == null) throw "Cannot create Transform with no DisplayObject."; + this._displayObject = displayObject; + this._matrix = new flash.geom.Matrix(); + this._fullMatrix = new flash.geom.Matrix(); + this.set_colorTransform(new flash.geom.ColorTransform()); }; -$hxClasses["flash.system.SecurityDomain"] = flash.system.SecurityDomain; -flash.system.SecurityDomain.__name__ = ["flash","system","SecurityDomain"]; -flash.system.SecurityDomain.prototype = { - __class__: flash.system.SecurityDomain -} -flash.text = {} -flash.text.Font = function() { - this.__metrics = []; - this.__fontScale = 9.0; - var className = Type.getClassName(Type.getClass(this)); - if(flash.text.Font.__fontData == null) { - flash.text.Font.__fontData = []; - flash.text.Font.__fontData["Bitstream_Vera_Sans"] = haxe.Unserializer.run(flash.text.Font.DEFAULT_FONT_DATA); +$hxClasses["flash.geom.Transform"] = flash.geom.Transform; +flash.geom.Transform.__name__ = ["flash","geom","Transform"]; +flash.geom.Transform.prototype = { + get_pixelBounds: function() { + return this._displayObject.getBounds(null); } - if(className == "flash.text.Font") this.set_fontName("Bitstream_Vera_Sans"); else this.set_fontName(className.split(".").pop()); -}; -$hxClasses["flash.text.Font"] = flash.text.Font; -flash.text.Font.__name__ = ["flash","text","Font"]; -flash.text.Font.enumerateFonts = function(enumerateDeviceFonts) { - if(enumerateDeviceFonts == null) enumerateDeviceFonts = false; - return flash.text.Font.__registeredFonts.slice(); -} -flash.text.Font.__ofResource = function(resourceName,fontName) { - if(fontName == null) fontName = ""; - var data = haxe.Unserializer.run(haxe.Resource.getString(resourceName)); - if(data == null) { - } else { - if(fontName == "") { - flash.text.Font.__fontData[resourceName] = data.hash; - fontName = data.fontName; - } - flash.text.Font.__fontData[data.fontName] = data.hash; + ,set_matrix: function(inValue) { + this._matrix.copy(inValue); + this._displayObject.__matrixOverridden(); + return this._matrix; } - return fontName; -} -flash.text.Font.registerFont = function(font) { - var instance = js.Boot.__cast(Type.createInstance(font,[]) , flash.text.Font); - if(instance != null) { - if(Reflect.hasField(font,"resourceName")) instance.set_fontName(flash.text.Font.__ofResource(Reflect.field(font,"resourceName"))); - flash.text.Font.__registeredFonts.push(instance); + ,get_matrix: function() { + return this._matrix.clone(); } -} -flash.text.Font.prototype = { - set_fontName: function(name) { - if(name == "_sans" || name == "_serif" || name == "_typewriter") name = "Bitstream_Vera_Sans"; - this.fontName = name; - if(flash.text.Font.__fontData[this.fontName] == null) try { - flash.text.Font.__ofResource(name); - } catch( e ) { - this.fontName = "Bitstream_Vera_Sans"; - } - if(flash.text.Font.__fontData[this.fontName] != null) try { - this.__glyphData = flash.text.Font.__fontData[this.fontName]; - } catch( e ) { - this.fontName = "Bitstream_Vera_Sans"; - } - return name; + ,get_concatenatedMatrix: function() { + return this.__getFullMatrix(this._matrix); } - ,__setScale: function(scale) { - this.__fontScale = scale / 1024; + ,set_colorTransform: function(inValue) { + this.colorTransform = inValue; + return inValue; } - ,__render: function(graphics,inChar,inX,inY,inOutline) { - var index = 0; - var glyph = this.__glyphData.get(inChar); - if(glyph == null) return; - var commands = glyph.commands; - var data = glyph.data; - var _g = 0; - while(_g < commands.length) { - var c = commands[_g]; - ++_g; - switch(c) { - case 1: - graphics.moveTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); - break; - case 2: - graphics.lineTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); - break; - case 3: - graphics.curveTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale,inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); - break; - } - } + ,__setMatrix: function(inValue) { + this._matrix.copy(inValue); } - ,__getAdvance: function(inGlyph,height) { - var m = this.__metrics[inGlyph]; - if(m == null) { - var glyph = this.__glyphData.get(inGlyph); - if(glyph == null) return 0; - this.__metrics[inGlyph] = m = glyph._width * this.__fontScale | 0; - } - if(m == null) return 0; - return m; + ,__setFullMatrix: function(inValue) { + this._fullMatrix.copy(inValue); + return this._fullMatrix; } - ,hasGlyph: function(str) { - return this.__glyphData.exists(HxOverrides.cca(str,0)); + ,__getFullMatrix: function(localMatrix) { + var m; + if(localMatrix != null) m = localMatrix.mult(this._fullMatrix); else m = this._fullMatrix.clone(); + return m; } - ,__class__: flash.text.Font - ,__properties__: {set_fontName:"set_fontName"} + ,__class__: flash.geom.Transform + ,__properties__: {set_colorTransform:"set_colorTransform",get_concatenatedMatrix:"get_concatenatedMatrix",set_matrix:"set_matrix",get_matrix:"get_matrix",get_pixelBounds:"get_pixelBounds"} } -flash.text.FontStyle = $hxClasses["flash.text.FontStyle"] = { __ename__ : true, __constructs__ : ["REGULAR","ITALIC","BOLD_ITALIC","BOLD"] } -flash.text.FontStyle.REGULAR = ["REGULAR",0]; -flash.text.FontStyle.REGULAR.toString = $estr; -flash.text.FontStyle.REGULAR.__enum__ = flash.text.FontStyle; -flash.text.FontStyle.ITALIC = ["ITALIC",1]; -flash.text.FontStyle.ITALIC.toString = $estr; -flash.text.FontStyle.ITALIC.__enum__ = flash.text.FontStyle; -flash.text.FontStyle.BOLD_ITALIC = ["BOLD_ITALIC",2]; -flash.text.FontStyle.BOLD_ITALIC.toString = $estr; -flash.text.FontStyle.BOLD_ITALIC.__enum__ = flash.text.FontStyle; -flash.text.FontStyle.BOLD = ["BOLD",3]; -flash.text.FontStyle.BOLD.toString = $estr; -flash.text.FontStyle.BOLD.__enum__ = flash.text.FontStyle; -flash.text.FontType = $hxClasses["flash.text.FontType"] = { __ename__ : true, __constructs__ : ["EMBEDDED","DEVICE"] } -flash.text.FontType.EMBEDDED = ["EMBEDDED",0]; -flash.text.FontType.EMBEDDED.toString = $estr; -flash.text.FontType.EMBEDDED.__enum__ = flash.text.FontType; -flash.text.FontType.DEVICE = ["DEVICE",1]; -flash.text.FontType.DEVICE.toString = $estr; -flash.text.FontType.DEVICE.__enum__ = flash.text.FontType; -flash.text.GridFitType = $hxClasses["flash.text.GridFitType"] = { __ename__ : true, __constructs__ : ["NONE","PIXEL","SUBPIXEL"] } -flash.text.GridFitType.NONE = ["NONE",0]; -flash.text.GridFitType.NONE.toString = $estr; -flash.text.GridFitType.NONE.__enum__ = flash.text.GridFitType; -flash.text.GridFitType.PIXEL = ["PIXEL",1]; -flash.text.GridFitType.PIXEL.toString = $estr; -flash.text.GridFitType.PIXEL.__enum__ = flash.text.GridFitType; -flash.text.GridFitType.SUBPIXEL = ["SUBPIXEL",2]; -flash.text.GridFitType.SUBPIXEL.toString = $estr; -flash.text.GridFitType.SUBPIXEL.__enum__ = flash.text.GridFitType; -flash.text.TextField = function() { - flash.display.InteractiveObject.call(this); - this.mWidth = 100; - this.mHeight = 20; - this.mHTMLMode = false; - this.multiline = false; - this.__graphics = new flash.display.Graphics(); - this.mFace = flash.text.TextField.mDefaultFont; - this.mAlign = flash.text.TextFormatAlign.LEFT; - this.mParagraphs = new Array(); - this.mSelStart = -1; - this.mSelEnd = -1; - this.scrollH = 0; - this.scrollV = 1; - this.mType = flash.text.TextFieldType.DYNAMIC; - this.set_autoSize("NONE"); - this.mTextHeight = 12; - this.mMaxHeight = this.mTextHeight; - this.mHTMLText = " "; - this.mText = " "; - this.mTextColour = 0; - this.tabEnabled = false; - this.mTryFreeType = true; - this.selectable = true; - this.mInsertPos = 0; - this.__inputEnabled = false; - this.mDownChar = 0; - this.mSelectDrag = -1; - this.mLineInfo = []; - this.set_defaultTextFormat(new flash.text.TextFormat()); - this.set_borderColor(0); - this.set_border(false); - this.set_backgroundColor(16777215); - this.set_background(false); - this.gridFitType = flash.text.GridFitType.PIXEL; - this.sharpness = 0; +flash.geom.Vector3D = function(x,y,z,w) { + if(w == null) w = 0.; + if(z == null) z = 0.; + if(y == null) y = 0.; + if(x == null) x = 0.; + this.w = w; + this.x = x; + this.y = y; + this.z = z; }; -$hxClasses["flash.text.TextField"] = flash.text.TextField; -flash.text.TextField.__name__ = ["flash","text","TextField"]; -flash.text.TextField.__super__ = flash.display.InteractiveObject; -flash.text.TextField.prototype = $extend(flash.display.InteractiveObject.prototype,{ - set_wordWrap: function(inWordWrap) { - this.wordWrap = inWordWrap; - this.Rebuild(); - return this.get_wordWrap(); +$hxClasses["flash.geom.Vector3D"] = flash.geom.Vector3D; +flash.geom.Vector3D.__name__ = ["flash","geom","Vector3D"]; +flash.geom.Vector3D.__properties__ = {get_Z_AXIS:"get_Z_AXIS",get_Y_AXIS:"get_Y_AXIS",get_X_AXIS:"get_X_AXIS"} +flash.geom.Vector3D.angleBetween = function(a,b) { + var a0 = new flash.geom.Vector3D(a.x,a.y,a.z,a.w); + a0.normalize(); + var b0 = new flash.geom.Vector3D(b.x,b.y,b.z,b.w); + b0.normalize(); + return Math.acos(a0.x * b0.x + a0.y * b0.y + a0.z * b0.z); +} +flash.geom.Vector3D.distance = function(pt1,pt2) { + var x = pt2.x - pt1.x; + var y = pt2.y - pt1.y; + var z = pt2.z - pt1.z; + return Math.sqrt(x * x + y * y + z * z); +} +flash.geom.Vector3D.get_X_AXIS = function() { + return new flash.geom.Vector3D(1,0,0); +} +flash.geom.Vector3D.get_Y_AXIS = function() { + return new flash.geom.Vector3D(0,1,0); +} +flash.geom.Vector3D.get_Z_AXIS = function() { + return new flash.geom.Vector3D(0,0,1); +} +flash.geom.Vector3D.prototype = { + get_lengthSquared: function() { + return this.x * this.x + this.y * this.y + this.z * this.z; } - ,get_wordWrap: function() { - return this.wordWrap; + ,get_length: function() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } - ,set_width: function(inValue) { - if(this.parent != null) this.parent.__invalidateBounds(); - if(this.get__boundsInvalid()) this.validateBounds(); - if(inValue != this.mWidth) { - this.mWidth = inValue; - this.Rebuild(); - } - return this.mWidth; + ,toString: function() { + return "Vector3D(" + this.x + ", " + this.y + ", " + this.z + ")"; } - ,get_width: function() { - return Math.max(this.mWidth,this.getBounds(this.get_stage()).width); + ,subtract: function(a) { + return new flash.geom.Vector3D(this.x - a.x,this.y - a.y,this.z - a.z); } - ,set_type: function(inType) { - this.mType = inType; - this.__inputEnabled = this.mType == flash.text.TextFieldType.INPUT; - if(this.mHTMLMode) { - if(this.__inputEnabled) flash.Lib.__setContentEditable(this.__graphics.__surface,true); else flash.Lib.__setContentEditable(this.__graphics.__surface,false); - } else if(this.__inputEnabled) { - this.set_htmlText(StringTools.replace(this.mText,"\n","
")); - flash.Lib.__setContentEditable(this.__graphics.__surface,true); - } - this.tabEnabled = this.get_type() == flash.text.TextFieldType.INPUT; - this.Rebuild(); - return inType; + ,scaleBy: function(s) { + this.x *= s; + this.y *= s; + this.z *= s; } - ,get_type: function() { - return this.mType; + ,project: function() { + this.x /= this.w; + this.y /= this.w; + this.z /= this.w; } - ,get_textHeight: function() { - return this.mMaxHeight; + ,normalize: function() { + var l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + if(l != 0) { + this.x /= l; + this.y /= l; + this.z /= l; + } + return l; } - ,get_textWidth: function() { - return this.mMaxWidth; + ,negate: function() { + this.x *= -1; + this.y *= -1; + this.z *= -1; } - ,set_textColor: function(inCol) { - this.mTextColour = inCol; - this.RebuildText(); - return inCol; + ,nearEquals: function(toCompare,tolerance,allFour) { + if(allFour == null) allFour = false; + return Math.abs(this.x - toCompare.x) < tolerance && Math.abs(this.y - toCompare.y) < tolerance && Math.abs(this.z - toCompare.z) < tolerance && (!allFour || Math.abs(this.w - toCompare.w) < tolerance); } - ,get_textColor: function() { - return this.mTextColour; + ,incrementBy: function(a) { + this.x += a.x; + this.y += a.y; + this.z += a.z; } - ,set_text: function(inText) { - this.mText = Std.string(inText); - this.mHTMLMode = false; - this.RebuildText(); - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - return this.mText; + ,equals: function(toCompare,allFour) { + if(allFour == null) allFour = false; + return this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w); } - ,get_text: function() { - if(this.mHTMLMode) this.ConvertHTMLToText(false); - return this.mText; + ,dotProduct: function(a) { + return this.x * a.x + this.y * a.y + this.z * a.z; } - ,set_scrollV: function(value) { - return this.scrollV = value; + ,decrementBy: function(a) { + this.x -= a.x; + this.y -= a.y; + this.z -= a.z; } - ,get_scrollV: function() { - return this.scrollV; + ,crossProduct: function(a) { + return new flash.geom.Vector3D(this.y * a.z - this.z * a.y,this.z * a.x - this.x * a.z,this.x * a.y - this.y * a.x,1); } - ,set_scrollH: function(value) { - return this.scrollH = value; + ,clone: function() { + return new flash.geom.Vector3D(this.x,this.y,this.z,this.w); } - ,get_scrollH: function() { - return this.scrollH; + ,add: function(a) { + return new flash.geom.Vector3D(this.x + a.x,this.y + a.y,this.z + a.z); } - ,get_numLines: function() { - return 0; + ,__class__: flash.geom.Vector3D + ,__properties__: {get_length:"get_length",get_lengthSquared:"get_lengthSquared"} +} +flash.media = {} +flash.media.Sound = function(stream,context) { + flash.events.EventDispatcher.call(this,this); + this.bytesLoaded = 0; + this.bytesTotal = 0; + this.id3 = null; + this.isBuffering = false; + this.length = 0; + this.url = null; + this.__soundChannels = new haxe.ds.IntMap(); + this.__soundIdx = 0; + if(stream != null) this.load(stream,context); +}; +$hxClasses["flash.media.Sound"] = flash.media.Sound; +flash.media.Sound.__name__ = ["flash","media","Sound"]; +flash.media.Sound.__canPlayMime = function(mime) { + var audio = js.Browser.document.createElement("audio"); + var playable = function(ok) { + if(ok != "" && ok != "no") return true; else return false; + }; + return playable(audio.canPlayType(mime,null)); +} +flash.media.Sound.__canPlayType = function(extension) { + var mime = flash.media.Sound.__mimeForExtension(extension); + if(mime == null) return false; + return flash.media.Sound.__canPlayMime(mime); +} +flash.media.Sound.__mimeForExtension = function(extension) { + var mime = null; + switch(extension) { + case "mp3": + mime = "audio/mpeg"; + break; + case "ogg": + mime = "audio/ogg; codecs=\"vorbis\""; + break; + case "wav": + mime = "audio/wav; codecs=\"1\""; + break; + case "aac": + mime = "audio/mp4; codecs=\"mp4a.40.2\""; + break; + default: + mime = null; } - ,set_multiline: function(value) { - return this.multiline = value; + return mime; +} +flash.media.Sound.__super__ = flash.events.EventDispatcher; +flash.media.Sound.prototype = $extend(flash.events.EventDispatcher.prototype,{ + __onSoundLoaded: function(evt) { + this.__removeEventListeners(); + var evt1 = new flash.events.Event(flash.events.Event.COMPLETE); + this.dispatchEvent(evt1); } - ,get_multiline: function() { - return this.multiline; + ,__onSoundLoadError: function(evt) { + this.__removeEventListeners(); + var evt1 = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); + this.dispatchEvent(evt1); } - ,get_maxScrollV: function() { - return 0; + ,__removeEventListeners: function() { + this.__soundCache.removeEventListener(flash.events.Event.COMPLETE,$bind(this,this.__onSoundLoaded),false); + this.__soundCache.removeEventListener(flash.events.IOErrorEvent.IO_ERROR,$bind(this,this.__onSoundLoadError),false); } - ,get_maxScrollH: function() { - return 0; + ,__load: function(stream,context,mime) { + if(mime == null) mime = ""; + this.__streamUrl = stream.url; + try { + this.__soundCache = new flash.net.URLLoader(); + this.__addEventListeners(); + this.__soundCache.load(stream); + } catch( e ) { + } } - ,set_htmlText: function(inHTMLText) { - this.mParagraphs = new Array(); - this.mHTMLText = inHTMLText; - if(!this.mHTMLMode) { - var domElement = js.Browser.document.createElement("div"); - if(this.background || this.border) { - domElement.style.width = this.mWidth + "px"; - domElement.style.height = this.mHeight + "px"; - } - if(this.background) domElement.style.backgroundColor = "#" + StringTools.hex(this.backgroundColor,6); - if(this.border) domElement.style.border = "1px solid #" + StringTools.hex(this.borderColor,6); - domElement.style.color = "#" + StringTools.hex(this.mTextColour,6); - domElement.style.fontFamily = this.mFace; - domElement.style.fontSize = this.mTextHeight + "px"; - domElement.style.textAlign = Std.string(this.mAlign); - var wrapper = domElement; - wrapper.innerHTML = inHTMLText; - var destination = new flash.display.Graphics(wrapper); - var __surface = this.__graphics.__surface; - if(flash.Lib.__isOnStage(__surface)) { - flash.Lib.__appendSurface(wrapper); - flash.Lib.__copyStyle(__surface,wrapper); - flash.Lib.__swapSurface(__surface,wrapper); - flash.Lib.__removeSurface(__surface); - } - this.__graphics = destination; - this.__graphics.__extent.width = wrapper.width; - this.__graphics.__extent.height = wrapper.height; - } else this.__graphics.__surface.innerHTML = inHTMLText; - this.mHTMLMode = true; - this.RebuildText(); - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - return this.mHTMLText; + ,__addEventListeners: function() { + this.__soundCache.addEventListener(flash.events.Event.COMPLETE,$bind(this,this.__onSoundLoaded)); + this.__soundCache.addEventListener(flash.events.IOErrorEvent.IO_ERROR,$bind(this,this.__onSoundLoadError)); + } + ,play: function(startTime,loops,sndTransform) { + if(loops == null) loops = 0; + if(startTime == null) startTime = 0.0; + if(this.__streamUrl == null) return null; + var self = this; + var curIdx = this.__soundIdx; + var removeRef = function() { + self.__soundChannels.remove(curIdx); + }; + var channel = flash.media.SoundChannel.__create(this.__streamUrl,startTime,loops,sndTransform,removeRef); + this.__soundChannels.set(curIdx,channel); + this.__soundIdx++; + var audio = channel.__audio; + return channel; } - ,get_htmlText: function() { - return this.mHTMLText; + ,load: function(stream,context) { + this.__load(stream,context); } - ,set_height: function(inValue) { - if(this.parent != null) this.parent.__invalidateBounds(); - if(this.get__boundsInvalid()) this.validateBounds(); - if(inValue != this.mHeight) { - this.mHeight = inValue; - this.Rebuild(); - } - return this.mHeight; + ,close: function() { } - ,get_height: function() { - return Math.max(this.mHeight,this.getBounds(this.get_stage()).height); + ,__class__: flash.media.Sound +}); +flash.media.SoundChannel = function() { + flash.events.EventDispatcher.call(this,this); + this.ChannelId = -1; + this.leftPeak = 0.; + this.position = 0.; + this.rightPeak = 0.; + this.__audioCurrentLoop = 1; + this.__audioTotalLoops = 1; +}; +$hxClasses["flash.media.SoundChannel"] = flash.media.SoundChannel; +flash.media.SoundChannel.__name__ = ["flash","media","SoundChannel"]; +flash.media.SoundChannel.__create = function(src,startTime,loops,sndTransform,removeRef) { + if(loops == null) loops = 0; + if(startTime == null) startTime = 0.0; + var channel = new flash.media.SoundChannel(); + channel.__audio = js.Browser.document.createElement("audio"); + channel.__removeRef = removeRef; + channel.__audio.addEventListener("ended",$bind(channel,channel.__onSoundChannelFinished),false); + channel.__audio.addEventListener("seeked",$bind(channel,channel.__onSoundSeeked),false); + channel.__audio.addEventListener("stalled",$bind(channel,channel.__onStalled),false); + channel.__audio.addEventListener("progress",$bind(channel,channel.__onProgress),false); + if(loops > 0) { + channel.__audioTotalLoops = loops; + channel.__audio.loop = true; } - ,set_defaultTextFormat: function(inFmt) { - this.setTextFormat(inFmt); - this._defaultTextFormat = inFmt; - return inFmt; + channel.__startTime = startTime; + if(startTime > 0.) { + var onLoad = null; + onLoad = function(_) { + channel.__audio.currentTime = channel.__startTime; + channel.__audio.play(); + channel.__audio.removeEventListener("canplaythrough",onLoad,false); + }; + channel.__audio.addEventListener("canplaythrough",onLoad,false); + } else channel.__audio.autoplay = true; + channel.__audio.src = src; + return channel; +} +flash.media.SoundChannel.__super__ = flash.events.EventDispatcher; +flash.media.SoundChannel.prototype = $extend(flash.events.EventDispatcher.prototype,{ + set_soundTransform: function(v) { + this.__audio.volume = v.volume; + return this.soundTransform = v; } - ,get_defaultTextFormat: function() { - return this._defaultTextFormat; + ,__onStalled: function(evt) { + if(this.__audio != null) this.__audio.load(); } - ,get_caretPos: function() { - return this.mInsertPos; + ,__onSoundSeeked: function(evt) { + if(this.__audioCurrentLoop >= this.__audioTotalLoops) { + this.__audio.loop = false; + this.stop(); + } else this.__audioCurrentLoop++; } - ,get_bottomScrollV: function() { - return 0; + ,__onSoundChannelFinished: function(evt) { + if(this.__audioCurrentLoop >= this.__audioTotalLoops) { + this.__audio.removeEventListener("ended",$bind(this,this.__onSoundChannelFinished),false); + this.__audio.removeEventListener("seeked",$bind(this,this.__onSoundSeeked),false); + this.__audio.removeEventListener("stalled",$bind(this,this.__onStalled),false); + this.__audio.removeEventListener("progress",$bind(this,this.__onProgress),false); + this.__audio = null; + var evt1 = new flash.events.Event(flash.events.Event.SOUND_COMPLETE); + evt1.target = this; + this.dispatchEvent(evt1); + if(this.__removeRef != null) this.__removeRef(); + } else { + this.__audio.currentTime = this.__startTime; + this.__audio.play(); + } } - ,set_borderColor: function(inBorderCol) { - this.borderColor = inBorderCol; - this.Rebuild(); - return inBorderCol; + ,__onProgress: function(evt) { } - ,set_border: function(inBorder) { - this.border = inBorder; - this.Rebuild(); - return inBorder; + ,stop: function() { + if(this.__audio != null) { + this.__audio.pause(); + this.__audio = null; + if(this.__removeRef != null) this.__removeRef(); + } } - ,set_backgroundColor: function(inCol) { - this.backgroundColor = inCol; - this.Rebuild(); - return inCol; + ,__class__: flash.media.SoundChannel + ,__properties__: {set_soundTransform:"set_soundTransform"} +}); +flash.media.SoundLoaderContext = function(bufferTime,checkPolicyFile) { + if(checkPolicyFile == null) checkPolicyFile = false; + if(bufferTime == null) bufferTime = 0; + this.bufferTime = bufferTime; + this.checkPolicyFile = checkPolicyFile; +}; +$hxClasses["flash.media.SoundLoaderContext"] = flash.media.SoundLoaderContext; +flash.media.SoundLoaderContext.__name__ = ["flash","media","SoundLoaderContext"]; +flash.media.SoundLoaderContext.prototype = { + __class__: flash.media.SoundLoaderContext +} +flash.media.SoundTransform = function(vol,panning) { + if(panning == null) panning = 0; + if(vol == null) vol = 1; + this.volume = vol; + this.pan = panning; + this.leftToLeft = 0; + this.leftToRight = 0; + this.rightToLeft = 0; + this.rightToRight = 0; +}; +$hxClasses["flash.media.SoundTransform"] = flash.media.SoundTransform; +flash.media.SoundTransform.__name__ = ["flash","media","SoundTransform"]; +flash.media.SoundTransform.prototype = { + __class__: flash.media.SoundTransform +} +flash.net = {} +flash.net.URLLoader = function(request) { + flash.events.EventDispatcher.call(this); + this.bytesLoaded = 0; + this.bytesTotal = 0; + this.set_dataFormat(flash.net.URLLoaderDataFormat.TEXT); + if(request != null) this.load(request); +}; +$hxClasses["flash.net.URLLoader"] = flash.net.URLLoader; +flash.net.URLLoader.__name__ = ["flash","net","URLLoader"]; +flash.net.URLLoader.__super__ = flash.events.EventDispatcher; +flash.net.URLLoader.prototype = $extend(flash.events.EventDispatcher.prototype,{ + set_dataFormat: function(inputVal) { + if(inputVal == flash.net.URLLoaderDataFormat.BINARY && !Reflect.hasField(js.Browser.window,"ArrayBuffer")) this.dataFormat = flash.net.URLLoaderDataFormat.TEXT; else this.dataFormat = inputVal; + return this.dataFormat; } - ,set_background: function(inBack) { - this.background = inBack; - this.Rebuild(); - return inBack; + ,onStatus: function(status) { + var evt = new flash.events.HTTPStatusEvent(flash.events.HTTPStatusEvent.HTTP_STATUS,false,false,status); + evt.currentTarget = this; + this.dispatchEvent(evt); } - ,set_autoSize: function(inAutoSize) { - this.autoSize = inAutoSize; - this.Rebuild(); - return inAutoSize; + ,onSecurityError: function(msg) { + var evt = new flash.events.SecurityErrorEvent(flash.events.SecurityErrorEvent.SECURITY_ERROR); + evt.text = msg; + evt.currentTarget = this; + this.dispatchEvent(evt); } - ,get_autoSize: function() { - return this.autoSize; + ,onProgress: function(event) { + var evt = new flash.events.ProgressEvent(flash.events.ProgressEvent.PROGRESS); + evt.currentTarget = this; + evt.bytesLoaded = event.loaded; + evt.bytesTotal = event.total; + this.dispatchEvent(evt); } - ,__render: function(inMask,clipRect) { - if(!this.__combinedVisible) return; - if((this.___renderFlags & 4) != 0 || (this.___renderFlags & 8) != 0) this.__validateMatrix(); - if(this.__graphics.__render(inMask,this.__filters,1,1)) { - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - this.__applyFilters(this.__graphics.__surface); - this.___renderFlags |= 32; + ,onOpen: function() { + var evt = new flash.events.Event(flash.events.Event.OPEN); + evt.currentTarget = this; + this.dispatchEvent(evt); + } + ,onError: function(msg) { + var evt = new flash.events.IOErrorEvent(flash.events.IOErrorEvent.IO_ERROR); + evt.text = msg; + evt.currentTarget = this; + this.dispatchEvent(evt); + } + ,onData: function(_) { + var content = this.getData(); + var _g = this; + switch( (_g.dataFormat)[1] ) { + case 0: + this.data = flash.utils.ByteArray.__ofBuffer(content); + break; + default: + this.data = Std.string(content); } - if(!this.mHTMLMode && inMask != null) { - var m = this.getSurfaceTransform(this.__graphics); - flash.Lib.__drawToSurface(this.__graphics.__surface,inMask,m,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha,clipRect,this.gridFitType != flash.text.GridFitType.PIXEL); - } else { - if((this.___renderFlags & 32) != 0) { - var m = this.getSurfaceTransform(this.__graphics); - flash.Lib.__setSurfaceTransform(this.__graphics.__surface,m); - this.___renderFlags &= -33; + var evt = new flash.events.Event(flash.events.Event.COMPLETE); + evt.currentTarget = this; + this.dispatchEvent(evt); + } + ,requestUrl: function(url,method,data,requestHeaders) { + var xmlHttpRequest = new XMLHttpRequest(); + this.registerEvents(xmlHttpRequest); + var uri = ""; + if(js.Boot.__instanceof(data,flash.utils.ByteArray)) { + var data1 = data; + var _g = this; + switch( (_g.dataFormat)[1] ) { + case 0: + uri = data1.data.buffer; + break; + default: + uri = data1.readUTFBytes(data1.length); } - flash.Lib.__setSurfaceOpacity(this.__graphics.__surface,(this.parent != null?this.parent.__combinedAlpha:1) * this.alpha); + } else if(js.Boot.__instanceof(data,flash.net.URLVariables)) { + var data1 = data; + var _g = 0, _g1 = Reflect.fields(data1); + while(_g < _g1.length) { + var p = _g1[_g]; + ++_g; + if(uri.length != 0) uri += "&"; + uri += StringTools.urlEncode(p) + "=" + StringTools.urlEncode(Reflect.field(data1,p)); + } + } else if(data != null) uri = data.toString(); + try { + if(method == "GET" && uri != null && uri != "") { + var question = url.split("?").length <= 1; + xmlHttpRequest.open(method,url + (question?"?":"&") + Std.string(uri),true); + uri = ""; + } else xmlHttpRequest.open(method,url,true); + } catch( e ) { + this.onError(e.toString()); + return; + } + var _g = this; + switch( (_g.dataFormat)[1] ) { + case 0: + xmlHttpRequest.responseType = "arraybuffer"; + break; + default: } + var _g1 = 0; + while(_g1 < requestHeaders.length) { + var header = requestHeaders[_g1]; + ++_g1; + xmlHttpRequest.setRequestHeader(header.name,header.value); + } + xmlHttpRequest.send(uri); + this.onOpen(); + this.getData = function() { + if(xmlHttpRequest.response != null) return xmlHttpRequest.response; else return xmlHttpRequest.responseText; + }; } - ,__getObjectUnderPoint: function(point) { - if(!this.get_visible()) return null; else if(this.mText.length > 1) { - var local = this.globalToLocal(point); - if(local.x < 0 || local.y < 0 || local.x > this.mMaxWidth || local.y > this.mMaxHeight) return null; else return this; - } else return flash.display.InteractiveObject.prototype.__getObjectUnderPoint.call(this,point); - } - ,__getGraphics: function() { - return this.__graphics; - } - ,toString: function() { - return "[TextField name=" + this.name + " id=" + this.___id + "]"; + ,registerEvents: function(subject) { + var self = this; + if(typeof XMLHttpRequestProgressEvent != "undefined") subject.addEventListener("progress",$bind(this,this.onProgress),false); + subject.onreadystatechange = function() { + if(subject.readyState != 4) return; + var s = (function($this) { + var $r; + try { + $r = subject.status; + } catch( e ) { + $r = null; + } + return $r; + }(this)); + if(s == undefined) s = null; + if(s != null) self.onStatus(s); + if(s != null && s >= 200 && s < 400) self.onData(subject.response); else if(s == null) self.onError("Failed to connect or resolve host"); else if(s == 12029) self.onError("Failed to connect to host"); else if(s == 12007) self.onError("Unknown host"); else if(s == 0) { + self.onError("Unable to make request (may be blocked due to cross-domain permissions)"); + self.onSecurityError("Unable to make request (may be blocked due to cross-domain permissions)"); + } else self.onError("Http Error #" + subject.status); + }; } - ,setTextFormat: function(inFmt,beginIndex,endIndex) { - if(endIndex == null) endIndex = 0; - if(beginIndex == null) beginIndex = 0; - if(inFmt.font != null) this.mFace = inFmt.font; - if(inFmt.size != null) this.mTextHeight = inFmt.size | 0; - if(inFmt.align != null) this.mAlign = inFmt.align; - if(inFmt.color != null) this.mTextColour = inFmt.color; - this.RebuildText(); - this.___renderFlags |= 64; - if(this.parent != null) this.parent.___renderFlags |= 64; - return this.getTextFormat(); + ,load: function(request) { + this.requestUrl(request.url,request.method,request.data,request.formatRequestHeaders()); } - ,setSelection: function(beginIndex,endIndex) { + ,getData: function() { + return null; } - ,RenderRow: function(inRow,inY,inCharIdx,inAlign,inInsert) { - if(inInsert == null) inInsert = 0; - var h = 0; - var w = 0; - var _g = 0; - while(_g < inRow.length) { - var chr = inRow[_g]; - ++_g; - if(chr.fh > h) h = chr.fh; - w += chr.adv; - } - if(w > this.mMaxWidth) this.mMaxWidth = w; - var full_height = h * 1.2 | 0; - var align_x = 0; - var insert_x = 0; - if(inInsert != null) { - if(this.autoSize != "NONE") { - this.scrollH = 0; - insert_x = inInsert; - } else { - insert_x = inInsert - this.scrollH; - if(insert_x < 0) this.scrollH -= (this.mLimitRenderX * 3 >> 2) - insert_x; else if(insert_x > this.mLimitRenderX) this.scrollH += insert_x - (this.mLimitRenderX * 3 >> 2); - if(this.scrollH < 0) this.scrollH = 0; - } - } - if(this.autoSize == "NONE" && w <= this.mLimitRenderX) { - if(inAlign == flash.text.TextFormatAlign.CENTER) align_x = Math.round(this.mWidth) - w >> 1; else if(inAlign == flash.text.TextFormatAlign.RIGHT) align_x = Math.round(this.mWidth) - w; - } - var x_list = new Array(); - this.mLineInfo.push({ mY0 : inY, mIndex : inCharIdx - 1, mX : x_list}); - var cache_sel_font = null; - var cache_normal_font = null; - var x = align_x - this.scrollH; - var x0 = x; - var _g = 0; - while(_g < inRow.length) { - var chr = inRow[_g]; - ++_g; - var adv = chr.adv; - if(x + adv > this.mLimitRenderX) break; - x_list.push(x); - if(x >= 0) { - var font = chr.font; - if(chr.sel) { - this.__graphics.lineStyle(); - this.__graphics.beginFill(2105440); - this.__graphics.drawRect(x,inY,adv,full_height); - this.__graphics.endFill(); - if(cache_normal_font == chr.font) font = cache_sel_font; else { - font = flash.text.FontInstance.CreateSolid(chr.font.GetFace(),chr.fh,16777215,1.0); - cache_sel_font = font; - cache_normal_font = chr.font; - } - } - font.RenderChar(this.__graphics,chr.chr,x,inY + (h - chr.fh) | 0); - } - x += adv; - } - x += this.scrollH; - return full_height; + ,close: function() { } - ,RebuildText: function() { - this.mParagraphs = []; - if(!this.mHTMLMode) { - var font = flash.text.FontInstance.CreateSolid(this.mFace,this.mTextHeight,this.mTextColour,1.0); - var paras = this.mText.split("\n"); - var _g = 0; - while(_g < paras.length) { - var paragraph = paras[_g]; - ++_g; - this.mParagraphs.push({ align : this.mAlign, spans : [{ font : font, text : paragraph + "\n"}]}); - } + ,__class__: flash.net.URLLoader + ,__properties__: {set_dataFormat:"set_dataFormat"} +}); +flash.net.URLLoaderDataFormat = $hxClasses["flash.net.URLLoaderDataFormat"] = { __ename__ : true, __constructs__ : ["BINARY","TEXT","VARIABLES"] } +flash.net.URLLoaderDataFormat.BINARY = ["BINARY",0]; +flash.net.URLLoaderDataFormat.BINARY.toString = $estr; +flash.net.URLLoaderDataFormat.BINARY.__enum__ = flash.net.URLLoaderDataFormat; +flash.net.URLLoaderDataFormat.TEXT = ["TEXT",1]; +flash.net.URLLoaderDataFormat.TEXT.toString = $estr; +flash.net.URLLoaderDataFormat.TEXT.__enum__ = flash.net.URLLoaderDataFormat; +flash.net.URLLoaderDataFormat.VARIABLES = ["VARIABLES",2]; +flash.net.URLLoaderDataFormat.VARIABLES.toString = $estr; +flash.net.URLLoaderDataFormat.VARIABLES.__enum__ = flash.net.URLLoaderDataFormat; +flash.net.URLRequest = function(inURL) { + if(inURL != null) this.url = inURL; + this.requestHeaders = []; + this.method = flash.net.URLRequestMethod.GET; + this.contentType = null; +}; +$hxClasses["flash.net.URLRequest"] = flash.net.URLRequest; +flash.net.URLRequest.__name__ = ["flash","net","URLRequest"]; +flash.net.URLRequest.prototype = { + formatRequestHeaders: function() { + var res = this.requestHeaders; + if(res == null) res = []; + if(this.method == flash.net.URLRequestMethod.GET || this.data == null) return res; + if(js.Boot.__instanceof(this.data,String) || js.Boot.__instanceof(this.data,flash.utils.ByteArray)) { + res = res.slice(); + res.push(new flash.net.URLRequestHeader("Content-Type",this.contentType != null?this.contentType:"application/x-www-form-urlencoded")); } - this.Rebuild(); + return res; } - ,Rebuild: function() { - if(this.mHTMLMode) return; - this.mLineInfo = []; - this.__graphics.clear(); - if(this.background) { - this.__graphics.beginFill(this.backgroundColor); - this.__graphics.drawRect(0,0,this.get_width(),this.get_height()); - this.__graphics.endFill(); - } - this.__graphics.lineStyle(this.mTextColour); - var insert_x = null; - this.mMaxWidth = 0; - var wrap = this.mLimitRenderX = this.get_wordWrap() && !this.__inputEnabled?this.mWidth | 0:999999; - var char_idx = 0; - var h = 0; - var s0 = this.mSelStart; - var s1 = this.mSelEnd; - var _g = 0, _g1 = this.mParagraphs; - while(_g < _g1.length) { - var paragraph = _g1[_g]; - ++_g; - var row = []; - var row_width = 0; - var last_word_break = 0; - var last_word_break_width = 0; - var last_word_char_idx = 0; - var start_idx = char_idx; - var tx = 0; - var _g2 = 0, _g3 = paragraph.spans; - while(_g2 < _g3.length) { - var span = _g3[_g2]; - ++_g2; - var text = span.text; - var font = span.font; - var fh = font.get_height(); - last_word_break = row.length; - last_word_break_width = row_width; - last_word_char_idx = char_idx; - var _g5 = 0, _g4 = text.length; - while(_g5 < _g4) { - var ch = _g5++; - var g = HxOverrides.cca(text,ch); - var adv = font.__getAdvance(g); - if(g == 32) { - last_word_break = row.length; - last_word_break_width = tx; - last_word_char_idx = char_idx; - } - if(tx + adv > wrap) { - if(last_word_break > 0) { - var row_end = row.splice(last_word_break,row.length - last_word_break); - h += this.RenderRow(row,h,start_idx,paragraph.align); - row = row_end; - tx -= last_word_break_width; - start_idx = last_word_char_idx; - last_word_break = 0; - last_word_break_width = 0; - last_word_char_idx = 0; - if(row_end.length > 0 && row_end[0].chr == 32) { - row_end.shift(); - start_idx++; - } - } else { - h += this.RenderRow(row,h,char_idx,paragraph.align); - row = []; - tx = 0; - start_idx = char_idx; - } - } - row.push({ font : font, chr : g, x : tx, fh : fh, sel : char_idx >= s0 && char_idx < s1, adv : adv}); - tx += adv; - char_idx++; - } - } - if(row.length > 0) { - h += this.RenderRow(row,h,start_idx,paragraph.align,insert_x); - insert_x = null; - } + ,__class__: flash.net.URLRequest +} +flash.net.URLRequestHeader = function(name,value) { + if(value == null) value = ""; + if(name == null) name = ""; + this.name = name; + this.value = value; +}; +$hxClasses["flash.net.URLRequestHeader"] = flash.net.URLRequestHeader; +flash.net.URLRequestHeader.__name__ = ["flash","net","URLRequestHeader"]; +flash.net.URLRequestHeader.prototype = { + __class__: flash.net.URLRequestHeader +} +flash.net.URLRequestMethod = function() { } +$hxClasses["flash.net.URLRequestMethod"] = flash.net.URLRequestMethod; +flash.net.URLRequestMethod.__name__ = ["flash","net","URLRequestMethod"]; +flash.net.URLVariables = function(inEncoded) { + if(inEncoded != null) this.decode(inEncoded); +}; +$hxClasses["flash.net.URLVariables"] = flash.net.URLVariables; +flash.net.URLVariables.__name__ = ["flash","net","URLVariables"]; +flash.net.URLVariables.prototype = { + toString: function() { + var result = new Array(); + var fields = Reflect.fields(this); + var _g = 0; + while(_g < fields.length) { + var f = fields[_g]; + ++_g; + result.push(StringTools.urlEncode(f) + "=" + StringTools.urlEncode(Reflect.field(this,f))); } - var w = this.mMaxWidth; - if(h < this.mTextHeight) h = this.mTextHeight; - this.mMaxHeight = h; - var _g = this; - switch(_g.autoSize) { - case "LEFT": - break; - case "RIGHT": - var x0 = this.get_x() + this.get_width(); - this.set_x(this.mWidth - x0); - break; - case "CENTER": - var x0 = this.get_x() + this.get_width() / 2; - this.set_x(this.mWidth / 2 - x0); - break; - default: - if(this.get_wordWrap()) this.set_height(h); + return result.join("&"); + } + ,decode: function(inVars) { + var fields = Reflect.fields(this); + var _g = 0; + while(_g < fields.length) { + var f = fields[_g]; + ++_g; + Reflect.deleteField(this,f); } - if(this.border) { - this.__graphics.endFill(); - this.__graphics.lineStyle(1,this.borderColor,1,true); - this.__graphics.drawRect(.5,.5,this.get_width() - .5,this.get_height() - .5); + var fields1 = inVars.split(";").join("&").split("&"); + var _g = 0; + while(_g < fields1.length) { + var f = fields1[_g]; + ++_g; + var eq = f.indexOf("="); + if(eq > 0) this[StringTools.urlDecode(HxOverrides.substr(f,0,eq))] = StringTools.urlDecode(HxOverrides.substr(f,eq + 1,null)); else if(eq != 0) this[StringTools.urlDecode(f)] = ""; } } - ,getTextFormat: function(beginIndex,endIndex) { - if(endIndex == null) endIndex = 0; - if(beginIndex == null) beginIndex = 0; - return new flash.text.TextFormat(this.mFace,this.mTextHeight,this.mTextColour); + ,__class__: flash.net.URLVariables +} +flash.system = {} +flash.system.ApplicationDomain = function(parentDomain) { + if(parentDomain != null) this.parentDomain = parentDomain; else this.parentDomain = flash.system.ApplicationDomain.currentDomain; +}; +$hxClasses["flash.system.ApplicationDomain"] = flash.system.ApplicationDomain; +flash.system.ApplicationDomain.__name__ = ["flash","system","ApplicationDomain"]; +flash.system.ApplicationDomain.prototype = { + hasDefinition: function(name) { + return Type.resolveClass(name) != null; } - ,getLineIndexAtPoint: function(inX,inY) { - if(this.mLineInfo.length < 1) return -1; - if(inY <= 0) return 0; - var _g1 = 0, _g = this.mLineInfo.length; - while(_g1 < _g) { - var l = _g1++; - if(this.mLineInfo[l].mY0 > inY) return l == 0?0:l - 1; - } - return this.mLineInfo.length - 1; + ,getDefinition: function(name) { + return Type.resolveClass(name); } - ,getCharIndexAtPoint: function(inX,inY) { - var li = this.getLineIndexAtPoint(inX,inY); - if(li < 0) return -1; - var line = this.mLineInfo[li]; - var idx = line.mIndex; - var _g = 0, _g1 = line.mX; - while(_g < _g1.length) { - var x = _g1[_g]; - ++_g; - if(x > inX) return idx; - idx++; + ,__class__: flash.system.ApplicationDomain +} +flash.system.LoaderContext = function(checkPolicyFile,applicationDomain,securityDomain) { + if(checkPolicyFile == null) checkPolicyFile = false; + this.checkPolicyFile = checkPolicyFile; + this.securityDomain = securityDomain; + if(applicationDomain != null) this.applicationDomain = applicationDomain; else this.applicationDomain = flash.system.ApplicationDomain.currentDomain; +}; +$hxClasses["flash.system.LoaderContext"] = flash.system.LoaderContext; +flash.system.LoaderContext.__name__ = ["flash","system","LoaderContext"]; +flash.system.LoaderContext.prototype = { + __class__: flash.system.LoaderContext +} +flash.system.SecurityDomain = function() { +}; +$hxClasses["flash.system.SecurityDomain"] = flash.system.SecurityDomain; +flash.system.SecurityDomain.__name__ = ["flash","system","SecurityDomain"]; +flash.system.SecurityDomain.prototype = { + __class__: flash.system.SecurityDomain +} +flash.text.Font = function() { + this.__metrics = []; + this.__fontScale = 9.0; + var className = Type.getClassName(Type.getClass(this)); + if(flash.text.Font.__fontData == null) { + flash.text.Font.__fontData = []; + flash.text.Font.__fontData["Bitstream_Vera_Sans"] = haxe.Unserializer.run(flash.text.Font.DEFAULT_FONT_DATA); + } + if(className == "flash.text.Font") this.set_fontName("Bitstream_Vera_Sans"); else this.set_fontName(className.split(".").pop()); +}; +$hxClasses["flash.text.Font"] = flash.text.Font; +flash.text.Font.__name__ = ["flash","text","Font"]; +flash.text.Font.enumerateFonts = function(enumerateDeviceFonts) { + if(enumerateDeviceFonts == null) enumerateDeviceFonts = false; + return flash.text.Font.__registeredFonts.slice(); +} +flash.text.Font.__ofResource = function(resourceName,fontName) { + if(fontName == null) fontName = ""; + var data = haxe.Unserializer.run(haxe.Resource.getString(resourceName)); + if(data == null) { + } else { + if(fontName == "") { + flash.text.Font.__fontData[resourceName] = data.hash; + fontName = data.fontName; } - return idx; + flash.text.Font.__fontData[data.fontName] = data.hash; } - ,getCharBoundaries: function(a) { - return null; + return fontName; +} +flash.text.Font.registerFont = function(font) { + var instance = js.Boot.__cast(Type.createInstance(font,[]) , flash.text.Font); + if(instance != null) { + if(Reflect.hasField(font,"resourceName")) instance.set_fontName(flash.text.Font.__ofResource(Reflect.field(font,"resourceName"))); + flash.text.Font.__registeredFonts.push(instance); } - ,DecodeColour: function(col) { - return Std.parseInt("0x" + HxOverrides.substr(col,1,null)); +} +flash.text.Font.prototype = { + set_fontName: function(name) { + if(name == "_sans" || name == "_serif" || name == "_typewriter") name = "Bitstream_Vera_Sans"; + this.fontName = name; + if(flash.text.Font.__fontData[this.fontName] == null) try { + flash.text.Font.__ofResource(name); + } catch( e ) { + this.fontName = "Bitstream_Vera_Sans"; + } + if(flash.text.Font.__fontData[this.fontName] != null) try { + this.__glyphData = flash.text.Font.__fontData[this.fontName]; + } catch( e ) { + this.fontName = "Bitstream_Vera_Sans"; + } + return name; } - ,ConvertHTMLToText: function(inUnSetHTML) { - this.mText = ""; - var _g = 0, _g1 = this.mParagraphs; - while(_g < _g1.length) { - var paragraph = _g1[_g]; + ,__setScale: function(scale) { + this.__fontScale = scale / 1024; + } + ,__render: function(graphics,inChar,inX,inY,inOutline) { + var index = 0; + var glyph = this.__glyphData.get(inChar); + if(glyph == null) return; + var commands = glyph.commands; + var data = glyph.data; + var _g = 0; + while(_g < commands.length) { + var c = commands[_g]; ++_g; - var _g2 = 0, _g3 = paragraph.spans; - while(_g2 < _g3.length) { - var span = _g3[_g2]; - ++_g2; - this.mText += span.text; + switch(c) { + case 1: + graphics.moveTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); + break; + case 2: + graphics.lineTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); + break; + case 3: + graphics.curveTo(inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale,inX + data[index++] * this.__fontScale,inY + data[index++] * this.__fontScale); + break; } } - if(inUnSetHTML) { - this.mHTMLMode = false; - this.RebuildText(); + } + ,__getAdvance: function(inGlyph,height) { + var m = this.__metrics[inGlyph]; + if(m == null) { + var glyph = this.__glyphData.get(inGlyph); + if(glyph == null) return 0; + this.__metrics[inGlyph] = m = glyph._width * this.__fontScale | 0; } + if(m == null) return 0; + return m; } - ,appendText: function(newText) { - var _g = this; - _g.set_text(_g.get_text() + newText); + ,hasGlyph: function(str) { + return this.__glyphData.exists(HxOverrides.cca(str,0)); } - ,__class__: flash.text.TextField - ,__properties__: $extend(flash.display.InteractiveObject.prototype.__properties__,{set_autoSize:"set_autoSize",set_background:"set_background",set_backgroundColor:"set_backgroundColor",set_border:"set_border",set_borderColor:"set_borderColor",get_bottomScrollV:"get_bottomScrollV",get_caretPos:"get_caretPos",set_defaultTextFormat:"set_defaultTextFormat",get_defaultTextFormat:"get_defaultTextFormat",set_htmlText:"set_htmlText",get_htmlText:"get_htmlText",get_maxScrollH:"get_maxScrollH",get_maxScrollV:"get_maxScrollV",get_numLines:"get_numLines",set_text:"set_text",get_text:"get_text",set_textColor:"set_textColor",get_textColor:"get_textColor",get_textHeight:"get_textHeight",get_textWidth:"get_textWidth",set_type:"set_type",get_type:"get_type",set_wordWrap:"set_wordWrap",get_wordWrap:"get_wordWrap"}) -}); + ,__class__: flash.text.Font + ,__properties__: {set_fontName:"set_fontName"} +} +flash.text.FontStyle = $hxClasses["flash.text.FontStyle"] = { __ename__ : true, __constructs__ : ["REGULAR","ITALIC","BOLD_ITALIC","BOLD"] } +flash.text.FontStyle.REGULAR = ["REGULAR",0]; +flash.text.FontStyle.REGULAR.toString = $estr; +flash.text.FontStyle.REGULAR.__enum__ = flash.text.FontStyle; +flash.text.FontStyle.ITALIC = ["ITALIC",1]; +flash.text.FontStyle.ITALIC.toString = $estr; +flash.text.FontStyle.ITALIC.__enum__ = flash.text.FontStyle; +flash.text.FontStyle.BOLD_ITALIC = ["BOLD_ITALIC",2]; +flash.text.FontStyle.BOLD_ITALIC.toString = $estr; +flash.text.FontStyle.BOLD_ITALIC.__enum__ = flash.text.FontStyle; +flash.text.FontStyle.BOLD = ["BOLD",3]; +flash.text.FontStyle.BOLD.toString = $estr; +flash.text.FontStyle.BOLD.__enum__ = flash.text.FontStyle; +flash.text.FontType = $hxClasses["flash.text.FontType"] = { __ename__ : true, __constructs__ : ["EMBEDDED","DEVICE"] } +flash.text.FontType.EMBEDDED = ["EMBEDDED",0]; +flash.text.FontType.EMBEDDED.toString = $estr; +flash.text.FontType.EMBEDDED.__enum__ = flash.text.FontType; +flash.text.FontType.DEVICE = ["DEVICE",1]; +flash.text.FontType.DEVICE.toString = $estr; +flash.text.FontType.DEVICE.__enum__ = flash.text.FontType; +flash.text.GridFitType = $hxClasses["flash.text.GridFitType"] = { __ename__ : true, __constructs__ : ["NONE","PIXEL","SUBPIXEL"] } +flash.text.GridFitType.NONE = ["NONE",0]; +flash.text.GridFitType.NONE.toString = $estr; +flash.text.GridFitType.NONE.__enum__ = flash.text.GridFitType; +flash.text.GridFitType.PIXEL = ["PIXEL",1]; +flash.text.GridFitType.PIXEL.toString = $estr; +flash.text.GridFitType.PIXEL.__enum__ = flash.text.GridFitType; +flash.text.GridFitType.SUBPIXEL = ["SUBPIXEL",2]; +flash.text.GridFitType.SUBPIXEL.toString = $estr; +flash.text.GridFitType.SUBPIXEL.__enum__ = flash.text.GridFitType; flash.text.FontInstanceMode = $hxClasses["flash.text.FontInstanceMode"] = { __ename__ : true, __constructs__ : ["fimSolid"] } flash.text.FontInstanceMode.fimSolid = ["fimSolid",0]; flash.text.FontInstanceMode.fimSolid.toString = $estr; @@ -11457,7 +11352,15 @@ $hxClasses["haxe.ds.StringMap"] = haxe.ds.StringMap; haxe.ds.StringMap.__name__ = ["haxe","ds","StringMap"]; haxe.ds.StringMap.__interfaces__ = [IMap]; haxe.ds.StringMap.prototype = { - keys: function() { + iterator: function() { + return { ref : this.h, it : this.keys(), hasNext : function() { + return this.it.hasNext(); + }, next : function() { + var i = this.it.next(); + return this.ref["$" + i]; + }}; + } + ,keys: function() { var a = []; for( var key in this.h ) { if(this.h.hasOwnProperty(key)) a.push(key.substr(1)); @@ -12581,13 +12484,108 @@ flash.display.DisplayObject.RENDER_VALIDATE_IN_PROGRESS = 1024; flash.display.DisplayObject.ALL_RENDER_FLAGS = 98; openfl.display.OpenGLView.CONTEXT_LOST = "glcontextlost"; openfl.display.OpenGLView.CONTEXT_RESTORED = "glcontextrestored"; -com.engine.game.Game.scrollX = 0; -com.engine.game.Game.scrollY = 0; com.engine.game.Game.viewWidth = 0; com.engine.game.Game.viewHeight = 0; +com.engine.game.Game.now = 0; +com.engine.game.Game.then = 0; +com.engine.game.Game.frameStart = 0; +com.engine.game.Game.fps = 0; +com.engine.game.Game.dt = 0; +com.engine.game.Game.frames = 0; +com.engine.game.Game.fixedTimestep = true; DefaultAssetLibrary.className = new haxe.ds.StringMap(); DefaultAssetLibrary.path = new haxe.ds.StringMap(); DefaultAssetLibrary.type = new haxe.ds.StringMap(); +com.engine.input.Keys.ANY = -1; +com.engine.input.Keys.LEFT = 37; +com.engine.input.Keys.UP = 38; +com.engine.input.Keys.RIGHT = 39; +com.engine.input.Keys.DOWN = 40; +com.engine.input.Keys.ENTER = 13; +com.engine.input.Keys.COMMAND = 15; +com.engine.input.Keys.CONTROL = 17; +com.engine.input.Keys.SPACE = 32; +com.engine.input.Keys.SHIFT = 16; +com.engine.input.Keys.BACKSPACE = 8; +com.engine.input.Keys.CAPS_LOCK = 20; +com.engine.input.Keys.DELETE = 46; +com.engine.input.Keys.END = 35; +com.engine.input.Keys.ESCAPE = 27; +com.engine.input.Keys.HOME = 36; +com.engine.input.Keys.INSERT = 45; +com.engine.input.Keys.TAB = 9; +com.engine.input.Keys.PAGE_DOWN = 34; +com.engine.input.Keys.PAGE_UP = 33; +com.engine.input.Keys.LEFT_SQUARE_BRACKET = 219; +com.engine.input.Keys.RIGHT_SQUARE_BRACKET = 221; +com.engine.input.Keys.TILDE = 192; +com.engine.input.Keys.A = 65; +com.engine.input.Keys.B = 66; +com.engine.input.Keys.C = 67; +com.engine.input.Keys.D = 68; +com.engine.input.Keys.E = 69; +com.engine.input.Keys.F = 70; +com.engine.input.Keys.G = 71; +com.engine.input.Keys.H = 72; +com.engine.input.Keys.I = 73; +com.engine.input.Keys.J = 74; +com.engine.input.Keys.K = 75; +com.engine.input.Keys.L = 76; +com.engine.input.Keys.M = 77; +com.engine.input.Keys.N = 78; +com.engine.input.Keys.O = 79; +com.engine.input.Keys.P = 80; +com.engine.input.Keys.Q = 81; +com.engine.input.Keys.R = 82; +com.engine.input.Keys.S = 83; +com.engine.input.Keys.T = 84; +com.engine.input.Keys.U = 85; +com.engine.input.Keys.V = 86; +com.engine.input.Keys.W = 87; +com.engine.input.Keys.X = 88; +com.engine.input.Keys.Y = 89; +com.engine.input.Keys.Z = 90; +com.engine.input.Keys.F1 = 112; +com.engine.input.Keys.F2 = 113; +com.engine.input.Keys.F3 = 114; +com.engine.input.Keys.F4 = 115; +com.engine.input.Keys.F5 = 116; +com.engine.input.Keys.F6 = 117; +com.engine.input.Keys.F7 = 118; +com.engine.input.Keys.F8 = 119; +com.engine.input.Keys.F9 = 120; +com.engine.input.Keys.F10 = 121; +com.engine.input.Keys.F11 = 122; +com.engine.input.Keys.F12 = 123; +com.engine.input.Keys.F13 = 124; +com.engine.input.Keys.F14 = 125; +com.engine.input.Keys.F15 = 126; +com.engine.input.Keys.DIGIT_0 = 48; +com.engine.input.Keys.DIGIT_1 = 49; +com.engine.input.Keys.DIGIT_2 = 50; +com.engine.input.Keys.DIGIT_3 = 51; +com.engine.input.Keys.DIGIT_4 = 52; +com.engine.input.Keys.DIGIT_5 = 53; +com.engine.input.Keys.DIGIT_6 = 54; +com.engine.input.Keys.DIGIT_7 = 55; +com.engine.input.Keys.DIGIT_8 = 56; +com.engine.input.Keys.DIGIT_9 = 57; +com.engine.input.Keys.NUMPAD_0 = 96; +com.engine.input.Keys.NUMPAD_1 = 97; +com.engine.input.Keys.NUMPAD_2 = 98; +com.engine.input.Keys.NUMPAD_3 = 99; +com.engine.input.Keys.NUMPAD_4 = 100; +com.engine.input.Keys.NUMPAD_5 = 101; +com.engine.input.Keys.NUMPAD_6 = 102; +com.engine.input.Keys.NUMPAD_7 = 103; +com.engine.input.Keys.NUMPAD_8 = 104; +com.engine.input.Keys.NUMPAD_9 = 105; +com.engine.input.Keys.NUMPAD_ADD = 107; +com.engine.input.Keys.NUMPAD_DECIMAL = 110; +com.engine.input.Keys.NUMPAD_DIVIDE = 111; +com.engine.input.Keys.NUMPAD_ENTER = 108; +com.engine.input.Keys.NUMPAD_MULTIPLY = 106; +com.engine.input.Keys.NUMPAD_SUBTRACT = 109; com.engine.misc.Util.DEG = -180 / Math.PI; com.engine.misc.Util.RAD = Math.PI / -180; com.engine.misc.Util.EPSILON = 0.00000001; @@ -12595,6 +12593,29 @@ com.engine.render.BlendMode.NORMAL = 0; com.engine.render.BlendMode.ADD = 1; com.engine.render.BlendMode.MULTIPLY = 2; com.engine.render.BlendMode.SCREEN = 3; +com.engine.render.BlendMode.TRANSPARENT = 4; +com.engine.render.filter.Filter.vertexAttribute = 0; +com.engine.render.filter.Filter.texCoordAttribute = 1; +com.engine.render.filter.Filter.colorAttribute = 2; +com.engine.render.filter.Filter.colorVertexShader = "\r\nattribute vec3 aVertexPosition;\r\nattribute vec4 aColor;\r\n\r\nvarying vec4 vColor;\r\n\r\nuniform mat4 uModelViewMatrix;\r\nuniform mat4 uProjectionMatrix;\r\nvoid main(void) \r\n{\r\nvColor = aColor;\r\ngl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0);\r\n}"; +com.engine.render.filter.Filter.colorFragmentShader = "precision mediump float;" + "\r\n\r\nvarying vec4 vColor;\r\nvoid main(void)\r\n{\r\n\tgl_FragColor = vColor;\r\n}"; +com.engine.render.filter.Filter.textureVertexShader = "\r\nattribute vec3 aVertexPosition;\r\nattribute vec2 aTexCoord;\r\nattribute vec4 aColor;\r\n\r\nvarying vec2 vTexCoord;\r\nvarying vec4 vColor;\r\n\r\nuniform mat4 uModelViewMatrix;\r\nuniform mat4 uProjectionMatrix;\r\nvoid main(void) \r\n{\r\nvTexCoord = aTexCoord;\r\nvColor = aColor;\r\ngl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0);\r\n\r\n}"; +com.engine.render.filter.Filter.textureFragmentShader = "precision mediump float;" + "\r\nvarying vec2 vTexCoord;\r\nvarying vec4 vColor;\r\nuniform sampler2D uImage0;\r\n\r\nvoid main(void)\r\n{\r\n\tgl_FragColor = texture2D (uImage0, vTexCoord) * vColor;\r\n\r\n}"; +com.engine.render.filter.Filter.normalFilter = "precision mediump float;" + "varying vec2 vTexCoord;\r\n\t\t\tuniform sampler2D uImage0;\r\n\t\t\tvoid main(void)\r\n\t\t\t{\r\n\t\t\tgl_FragColor = texture2D (uImage0, vTexCoord);\r\n\t\t\t}"; +com.engine.render.filter.Filter.grayFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform sampler2D uImage0;\r\n uniform float gray;\r\n\r\n void main(void)\r\n\t\t{\r\n gl_FragColor = texture2D(uImage0, vTexCoord);\r\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);\r\n }"; +com.engine.render.filter.Filter.colorStepFilter = "precision mediump float;" + " varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform sampler2D uImage0;\r\n uniform float step;\r\n\r\n void main(void) \r\n\t\t{\r\n vec4 color = texture2D(uImage0, vTexCoord);\r\n color = floor(color * step) / step;\r\n gl_FragColor = color;\r\n };"; +com.engine.render.filter.Filter.invertFilter = "precision mediump float;" + " varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform float invert;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) {\r\n gl_FragColor = texture2D(uImage0, vTexCoord);\r\n gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert);\r\n }"; +com.engine.render.filter.Filter.blurYFilter = "precision mediump float;" + " varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform float blur;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) {\r\n vec4 sum = vec4(0.0);\r\n\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 4.0*blur)) * 0.05;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 3.0*blur)) * 0.09;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 2.0*blur)) * 0.12;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - blur)) * 0.15;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + blur)) * 0.15;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 2.0*blur)) * 0.12;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 3.0*blur)) * 0.09;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 4.0*blur)) * 0.05;\r\n\r\n gl_FragColor = sum;\r\n }"; +com.engine.render.filter.Filter.blurXFilter = "precision mediump float;" + " varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform float blur;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) {\r\n vec4 sum = vec4(0.0);\r\n\r\n sum += texture2D(uImage0, vec2(vTexCoord.x - 4.0*blur, vTexCoord.y)) * 0.05;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x - 3.0*blur, vTexCoord.y)) * 0.09;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x - 2.0*blur, vTexCoord.y)) * 0.12;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x - blur, vTexCoord.y)) * 0.15;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x + blur, vTexCoord.y)) * 0.15;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x + 2.0*blur, vTexCoord.y)) * 0.12;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x + 3.0*blur, vTexCoord.y)) * 0.09;\r\n sum += texture2D(uImage0, vec2(vTexCoord.x + 4.0*blur, vTexCoord.y)) * 0.05;\r\n\r\n gl_FragColor = sum;\r\n }"; +com.engine.render.filter.Filter.twistFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform vec4 dimensions;\r\n uniform sampler2D uImage0;\r\n\r\n uniform float radius;\r\n uniform float angle;\r\n uniform vec2 offset;\r\n\r\n void main(void) {\r\n vec2 coord = vTexCoord - offset;\r\n float distance = length(coord);\r\n\r\n if (distance < radius) {\r\n float ratio = (radius - distance) / radius;\r\n float angleMod = ratio * ratio * angle;\r\n float s = sin(angleMod);\r\n float c = cos(angleMod);\r\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\r\n }\r\n\r\n gl_FragColor = texture2D(uImage0, coord+offset);\r\n }"; +com.engine.render.filter.Filter.sepiaFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform float sepia;\r\n uniform sampler2D uImage0;\r\n\r\n const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912);\r\n\r\n void main(void) {\r\n gl_FragColor = texture2D(uImage0, vTexCoord);\r\n gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia);\r\n }"; +com.engine.render.filter.Filter.blurFilter = "precision mediump float;" + " \r\n precision mediump float;\r\n varying vec2 vTexCoord;\r\n uniform sampler2D uImage0;\r\n //'uniform vec2 delta;',\r\n const vec2 delta = vec2(1.0/10.0, 0.0);\r\n //'uniform float darkness;',\r\n\r\n float random(vec3 scale, float seed) {\r\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\r\n }\r\n\r\n\r\n void main(void) {\r\n vec4 color = vec4(0.0);\r\n float total = 0.0;\r\n\r\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\r\n\r\n for (float t = -30.0; t <= 30.0; t++) \r\n\t\t {\r\n float percent = (t + offset - 0.5) / 30.0;\r\n float weight = 1.0 - abs(percent);\r\n vec4 sample = texture2D(uImage0, vTexCoord + delta * percent);\r\n sample.rgb *= sample.a;\r\n color += sample * weight;\r\n total += weight;\r\n }\r\n\r\n gl_FragColor = color / total;\r\n gl_FragColor.rgb /= gl_FragColor.a + 0.00001;\r\n //' gl_FragColor.rgb *= darkness;',\r\n }"; +com.engine.render.filter.Filter.pixelateFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform vec2 pixelSize;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) \r\n\t\t{\r\n vec4 dimensions = vec4(10000, 100, 10, 10);\r\n\t\t vec2 size = dimensions.xy/pixelSize;\r\n vec2 color = floor( ( vTexCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5;\r\n gl_FragColor = texture2D(uImage0, color);\r\n }"; +com.engine.render.filter.Filter.dotscreenFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform sampler2D uImage0;\r\n uniform float angle;\r\n uniform float scale;\r\n\t\t\r\n\r\n float pattern() \r\n\t\t{\r\n\t\t vec4 dimensions = vec4(0,0,0,0);\r\n float s = sin(angle), c = cos(angle);\r\n vec2 tex = vTexCoord * dimensions.xy;\r\n vec2 point = vec2(\r\n c * tex.x - s * tex.y,\r\n s * tex.x + c * tex.y\r\n ) * scale;\r\n return (sin(point.x) * sin(point.y)) * 4.0;\r\n }\r\n\r\n void main() {\r\n vec4 color = texture2D(uImage0, vTexCoord);\r\n float average = (color.r + color.g + color.b) / 3.0;\r\n gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\r\n }"; +com.engine.render.filter.Filter.rgbsplitFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n\t\tuniform float distance;\r\n uniform vec2 red;\r\n uniform vec2 green;\r\n uniform vec2 blue;\r\n uniform vec4 dimensions;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) \r\n\t\t{\r\n gl_FragColor.r = texture2D(uImage0, vTexCoord + red/distance).r;\r\n gl_FragColor.g = texture2D(uImage0, vTexCoord + green/distance).g;\r\n gl_FragColor.b = texture2D(uImage0, vTexCoord + blue/distance).b;\r\n gl_FragColor.a = texture2D(uImage0, vTexCoord).a;\r\n }"; +com.engine.render.filter.Filter.croshatchFilter = "precision mediump float;" + " \t\t\r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform float blur;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) {\r\n float lum = length(texture2D(uImage0, vTexCoord.xy).rgb);\r\n\r\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\r\n\r\n if (lum < 1.00) {\r\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {\r\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\r\n }\r\n }\r\n\r\n if (lum < 0.75) {\r\n if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {\r\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\r\n }\r\n }\r\n if (lum < 0.50) {\r\n if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {\r\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\r\n }\r\n }\r\n\r\n if (lum < 0.3) {\r\n if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {\r\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\r\n }\r\n }\r\n }"; +com.engine.render.filter.Filter.colormatrixFilter = "precision mediump float;" + " \r\n varying vec2 vTexCoord;\r\n varying vec4 vColor;\r\n uniform mat4 matrix;\r\n uniform sampler2D uImage0;\r\n\r\n void main(void) {\r\n gl_FragColor = texture2D(uImage0, vTexCoord) * matrix;\r\n }"; +flash.text.TextField.mDefaultFont = "Bitstream_Vera_Sans"; flash.Lib.HTML_ACCELEROMETER_EVENT_TYPE = "devicemotion"; flash.Lib.HTML_ORIENTATION_EVENT_TYPE = "orientationchange"; flash.Lib.DEFAULT_HEIGHT = 500; @@ -12750,7 +12771,6 @@ flash.text.Font.DEFAULT_FONT_SCALE = 9.0; flash.text.Font.DEFAULT_FONT_NAME = "Bitstream_Vera_Sans"; flash.text.Font.DEFAULT_CLASS_NAME = "flash.text.Font"; flash.text.Font.__registeredFonts = new Array(); -flash.text.TextField.mDefaultFont = "Bitstream_Vera_Sans"; flash.text.FontInstance.mSolidFonts = new haxe.ds.StringMap(); flash.text.TextFieldAutoSize.CENTER = "CENTER"; flash.text.TextFieldAutoSize.LEFT = "LEFT"; diff --git a/bin/html5/bin/index.html b/bin/html5/bin/index.html index f1ba10b..10f7982 100755 --- a/bin/html5/bin/index.html +++ b/bin/html5/bin/index.html @@ -11,7 +11,7 @@ -

+
diff --git a/bin/html5/haxe/ApplicationMain.hx b/bin/html5/haxe/ApplicationMain.hx index 4b6c292..784b868 100755 --- a/bin/html5/haxe/ApplicationMain.hx +++ b/bin/html5/haxe/ApplicationMain.hx @@ -56,6 +56,13 @@ class ApplicationMain { + var loader:Loader = new Loader(); + loaders.set("assets/Background.jpg", loader); + total ++; + + + + var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = BINARY; urlLoaders.set("assets/desert.tmx", urlLoader); @@ -124,6 +131,13 @@ class ApplicationMain { + var loader:Loader = new Loader(); + loaders.set("assets/texture.jpg", loader); + total ++; + + + + var loader:Loader = new Loader(); loaders.set("assets/texture.png", loader); total ++; diff --git a/bin/html5/haxe/DefaultAssetLibrary.hx b/bin/html5/haxe/DefaultAssetLibrary.hx index c86bb73..cc96425 100755 --- a/bin/html5/haxe/DefaultAssetLibrary.hx +++ b/bin/html5/haxe/DefaultAssetLibrary.hx @@ -36,6 +36,8 @@ class DefaultAssetLibrary extends AssetLibrary { #if flash + className.set ("assets/Background.jpg", __ASSET__assets_background_jpg); + type.set ("assets/Background.jpg", Reflect.field (AssetType, "image".toUpperCase ())); className.set ("assets/desert.tmx", __ASSET__assets_desert_tmx); type.set ("assets/desert.tmx", Reflect.field (AssetType, "binary".toUpperCase ())); className.set ("assets/hxlogo.png", __ASSET__assets_hxlogo_png); @@ -54,6 +56,8 @@ class DefaultAssetLibrary extends AssetLibrary { type.set ("assets/sewer_tileset.png", Reflect.field (AssetType, "image".toUpperCase ())); className.set ("assets/sprites.png", __ASSET__assets_sprites_png); type.set ("assets/sprites.png", Reflect.field (AssetType, "image".toUpperCase ())); + className.set ("assets/texture.jpg", __ASSET__assets_texture_jpg); + type.set ("assets/texture.jpg", Reflect.field (AssetType, "image".toUpperCase ())); className.set ("assets/texture.png", __ASSET__assets_texture_png); type.set ("assets/texture.png", Reflect.field (AssetType, "image".toUpperCase ())); className.set ("assets/TileMap.tmx", __ASSET__assets_tilemap_tmx); @@ -68,6 +72,8 @@ class DefaultAssetLibrary extends AssetLibrary { #elseif html5 + path.set ("assets/Background.jpg", "assets/Background.jpg"); + type.set ("assets/Background.jpg", Reflect.field (AssetType, "image".toUpperCase ())); path.set ("assets/desert.tmx", "assets/desert.tmx"); type.set ("assets/desert.tmx", Reflect.field (AssetType, "binary".toUpperCase ())); path.set ("assets/hxlogo.png", "assets/hxlogo.png"); @@ -86,6 +92,8 @@ class DefaultAssetLibrary extends AssetLibrary { type.set ("assets/sewer_tileset.png", Reflect.field (AssetType, "image".toUpperCase ())); path.set ("assets/sprites.png", "assets/sprites.png"); type.set ("assets/sprites.png", Reflect.field (AssetType, "image".toUpperCase ())); + path.set ("assets/texture.jpg", "assets/texture.jpg"); + type.set ("assets/texture.jpg", Reflect.field (AssetType, "image".toUpperCase ())); path.set ("assets/texture.png", "assets/texture.png"); type.set ("assets/texture.png", Reflect.field (AssetType, "image".toUpperCase ())); path.set ("assets/TileMap.tmx", "assets/TileMap.tmx"); @@ -539,6 +547,7 @@ class DefaultAssetLibrary extends AssetLibrary { #if pixi #elseif flash +class __ASSET__assets_background_jpg extends flash.display.BitmapData { public function new () { super (0, 0); } } class __ASSET__assets_desert_tmx extends null { } class __ASSET__assets_hxlogo_png extends flash.display.BitmapData { public function new () { super (0, 0); } } class __ASSET__assets_map_tmx extends null { } @@ -548,6 +557,7 @@ class __ASSET__assets_scrol_tmx extends null { } class __ASSET__assets_sewers_tmx extends null { } class __ASSET__assets_sewer_tileset_png extends flash.display.BitmapData { public function new () { super (0, 0); } } class __ASSET__assets_sprites_png extends flash.display.BitmapData { public function new () { super (0, 0); } } +class __ASSET__assets_texture_jpg extends flash.display.BitmapData { public function new () { super (0, 0); } } class __ASSET__assets_texture_png extends flash.display.BitmapData { public function new () { super (0, 0); } } class __ASSET__assets_tilemap_tmx extends null { } class __ASSET__assets_tiles_png extends flash.display.BitmapData { public function new () { super (0, 0); } } @@ -573,4 +583,6 @@ class __ASSET__assets_zazaka_png extends flash.display.BitmapData { public funct + + #end \ No newline at end of file diff --git a/bin/windows/neko/bin/assets/Background.jpg b/bin/windows/neko/bin/assets/Background.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e0494383ca993baf107d2b175ae7fa9e166496a5 GIT binary patch literal 158141 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
yE11EkPx9zF7zItc}2tevWPNpGau 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

O&j-5oe`de7cfhx8FMq5xUs0W-P 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 PWhwM9>gBIL`gh=efdE8@ literal 0 HcmV?d00001 diff --git a/bin/windows/neko/bin/assets/desert.tmx b/bin/windows/neko/bin/assets/desert.tmx index 7670483..de91ea9 100755 --- a/bin/windows/neko/bin/assets/desert.tmx +++ b/bin/windows/neko/bin/assets/desert.tmx @@ -26,1607 +26,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,14,15,16,30,31,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,25,26,27,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,14,15,16,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,33,34,35,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,31,22,23,24,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,41,42,43,30,1,30,30,30,30,30,30,30,30,30,30,30,30,30,30,1,2,3,30,30,31,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,40,30,30,30,30,33,34,36,42,37,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,38,30,30,33,34,35,30,33,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,48,38,30,30,30,30,33,34,44,26,45,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,40,30,30,30,40,30,30,30,33,34,34,34,34,34,34,34,36,42,37,34,35,9,10,11,30,30,30,30,10,30,10,30,30,30,30,30,30, +40,30,30,30,30,40,38,30,30,38,30,33,34,34,34,34,34,34,34,44,26,45,34,35,9,10,11,30,30,30,30,30,30,10,30,30,30,30,30,30, +30,39,30,30,30,38,30,40,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,39,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,9,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +7,7,8,1,2,2,2,2,2,2,2,2,3,1,2,2,2,2,2,2,2,2,2,2,29,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +15,15,16,9,10,10,10,10,10,10,10,10,11,9,10,10,10,10,10,10,10,10,10,10,10,10,11,30,30,30,30,30,30,30,30,30,30,30,30,30, +23,23,24,17,18,18,18,18,18,18,18,18,19,17,18,18,18,18,18,18,18,18,18,18,18,18,19,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,31, +30,30,30,30,39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32, +39,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,25,26,26,26,26,26,26,26,26,26,26,26,27,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,30,33,34,34,34,34,34,34,34,34,36,42,37,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,39,30,30,30,33,34,34,34,34,34,34,34,34,35,48,33,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,44,26,45,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,47,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,48, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,33,34,34,34,34,34,34,34,34,34,34,34,35,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,41,42,42,42,42,42,42,42,42,42,42,42,43,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30,30,31,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,32,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, +30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30 + diff --git a/bin/windows/neko/bin/assets/map.tmx b/bin/windows/neko/bin/assets/map.tmx index 121b3c2..f74954a 100755 --- a/bin/windows/neko/bin/assets/map.tmx +++ b/bin/windows/neko/bin/assets/map.tmx @@ -4,607 +4,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +14,2,2,2,2,13,6,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,13, +5,0,0,0,0,7,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,19,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,10,10,10,10,10,10,10,10,16,0,0,15,10,10,10,10,17, +5,0,0,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,5,0,0,7,6,6,6,6,6, +5,0,0,0,0,0,0,0,0,0,0,15,17,6,14,2,2,2,2,2,2,20,0,0,19,2,2,2,2,13, +5,0,0,0,0,15,10,16,0,0,15,17,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,7,6,5,0,15,17,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +18,10,10,10,10,17,6,18,10,17,6,6,6,6,5,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,18,10,16,0,0,0,15,10,10,10,10,16,0,0,0,7, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,0,0,0,7,6,6,6,6,5,0,0,0,7, +6,6,6,6,6,14,2,2,2,2,2,2,2,2,2,2,20,0,0,0,19,2,2,2,2,20,0,0,0,7, +6,6,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +14,2,2,2,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, +5,0,0,0,0,0,0,0,0,0,0,0,15,16,0,0,15,16,0,0,15,16,0,0,0,15,10,10,10,17, +5,0,0,0,0,0,0,0,15,16,0,0,19,20,0,0,19,20,0,0,7,5,0,0,8,7,6,6,6,6, +5,0,0,0,0,0,0,0,7,5,0,0,0,0,0,0,0,0,0,0,7,18,10,10,10,17,6,6,6,6, +5,0,0,0,15,16,0,0,7,18,16,0,0,0,0,0,0,0,0,0,7,6,6,6,6,6,6,6,6,6, +18,10,10,10,17,18,10,10,17,6,18,10,10,10,10,10,10,10,10,10,17,6,6,6,6,6,6,6,6,6 + diff --git a/bin/windows/neko/bin/assets/sewers.tmx b/bin/windows/neko/bin/assets/sewers.tmx index baf33c5..869e0b4 100755 --- a/bin/windows/neko/bin/assets/sewers.tmx +++ b/bin/windows/neko/bin/assets/sewers.tmx @@ -9,2507 +9,111 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,36,42,37,37,42,38,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,33,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,9,10,11,34,35,28,28,33,12,13,14,35,28,28,28,28,33,20,2,2,2,2,2,2,2,2,2,2,2,2,2,22,34,34,34,35,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,17,18,19,34,35,28,28,33,12,13,14,35,28,28,28,28,33,9,10,10,10,10,10,10,39,10,10,10,10,10,10,11,34,36,42,43,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,33,17,18,18,18,18,40,18,18,18,18,18,18,18,18,19,34,35,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,34,34,34,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +13,14,34,34,12,13,14,34,35,28,28,33,12,13,14,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +2,22,34,34,20,2,22,34,35,28,28,33,12,13,14,35,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +10,11,34,34,9,10,11,34,35,28,28,33,20,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +18,19,34,34,17,18,19,34,35,28,28,33,9,10,11,35,28,28,28,28,25,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +34,34,34,34,34,34,34,34,35,28,28,33,17,70,19,35,28,28,28,28,33,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +42,42,42,42,42,42,42,42,43,28,28,41,42,42,42,43,28,28,28,28,41,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,25,26,26,26,26,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,34,34,34,34,34,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,12,13,13,13,14,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,20,2,2,2,22,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,9,10,10,10,11,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,33,17,70,18,70,19,35,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,41,42,42,42,42,42,43,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,28,28,28,28,28,34,28,28,28,28,34,28,28,28,34,28,28,28,28,28,28,28,28,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,34,34,34,34,28,28,34,34,34,34,34,34,28,28,28,34,28,28,28,34,34,34,34,34,34,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, +28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,54,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,58,59,59,59,59,59,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + diff --git a/bin/windows/neko/bin/assets/texture.jpg b/bin/windows/neko/bin/assets/texture.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8bc4246d5a5169a578689d7fb6e49accb3206399 GIT binary patch literal 43183 zcma%iXH*kT@L(DVH6-*<1B70rgf0-I_fVySp(7woP(dJo5_(5KkkA8&N^hd{qM&r8 zcLaZeA}XMO=l|Z_eZJYZZ}-i--JK7!Q+NM<{JRc780i`60e~O?z~f&7{QUwz>fCm} zc^3c#KmY*1)qki%09?!C7QqwX(fbbr{JR8506-xS2o(fMMFpjS{_AwqP$)GWJuNLA zEiFBQ{(l349?pnhgwr!Kv#>BTb8~TVar6B@0K#A}26_e#1cHN;70Jr^{|NuTlfS(H zBsB;C0)T-?00;>LBY}Sh0qOtvqXGhf|M>hr00x2}R8Rnn`XBax;Q!+PjX)3>LWKYT z!5}IS1OkRqLBRj$KmZcN50=$pf>2oq+z6I~60@!`mo@fHZCDDjz`h+32gxW#YgqBxhLWdvPlk##SlIJT;dNt2!$FO{Zp}1qp{2sqMv*qZoDIlZJdl z!csd<2(=EU1F#`0uPFBqtT2xIYGzQ%AhQV#uP6@+dL>;8T<#$rJRXKyAK*qvkUlNB z4zZN0Ka^Ep+hU={=xjaXU+NOtftJtll1E;58BRd|gm zJ9-IZd4WhZk4SF{(kX~WVEHOPh-kT+ar7P6rR@dv1mSYn{i4#Y;=^>XH_<@uzH@|f zOToIXwi{lI1D+SglS3djNe;z|stT81i`_)X9|E+}0VUdXaJjozjWz6M$|3S9#>Q;8 zhqw6f1AJ3po=Sra|(jU`%OT2Qh-2_vsElo^~QGNYA|Oy!-?IMzx69eARJTN?gO0-(Ii2F{-zvYK0QJ(A=D={300oUlW0R^1=?x0F zql|4LwOk6=(!TMmyo9U_LGQCgcS0B@y>zOWDX^p?+_$OTJEd6qB+Q%2#sMsxZA*Gf zpM$$@j~fTq*3gA%FycRw4fA{3lhhcE!M%pnwD#3aXpOq8F_Xf?6tw@;r;}hB5vo?~OLcFT!E$^#W?v z1u~PS#=G&v%vgBTRSPG2qR^rNn=t?8$OK3^W$?NZ?ns`E-guoDsYAKC07LAomLL>$ z z_a=z~UBXaxYdb|yUreUn%F1;Ao{JPR9fFs9+S)Is_w#5k+%?VvRSp;sg0;>$1dQ} z72CQj#y_!3H>BkJfVx^`GJxD#Iq37n*v!X`^v09qC@%BdC$y zYGP}ag-tb&A1X`re>2^kr2nufqLa9;(bNlX6 zEChbP%8DI1pA1TYMFl0{RRit(4!uP=-hD@+C!-MInZ~0X{#;lZ;VgH1klY#i+Ir@K z^4K2fU93}_xV*J8;5&>n7J3IAL`tx)>&?81S1!JM`Xui&(M>}76WS&|rU*8ol_e(? z4`F0Z(8_XytAikN8FgBzGSp1Ei_+_p3Dg8s;bRE=$L}POIw*=Lo(&k(FhHEx7MWLi z@5U#k%#ByX!RH*j#4U`)40r^xz?*yQE~F0rq*}b{a-{&3&#rzQ%&#|jYII_bkt5p& z3LXRX#?9n3vhcCM84^G?0dxsjA78uJ85FIh3uVDIpQ@ElC#B9b`apOS%Ml9-t5@e_n zX2VmpEtle61Vb_dw%a%Fq0y-oE6OuWs%Y)YshrH8-*Js#gX;27EHziiH47dCNjM9& z+TlDB){-#l8rB9w)7e06Z55) zjS4DMQFo8@%5(~NgKUhiu7(q5Isj7kYV76wQ)qo|Jsw0j z#WY^gA%}HnFtYOOZj;-c%)C&PD7CasPW98+EPAck!Nkw|Ko3I!jRpm4Cb>-DXzhR5 z;C}6^lL(ZW?6)JW@mZDPOvQDdM#(uoEVYN7LX0)AQ}lD0Bv_8v*eP{SC~F9$Gf|}d zJftGc>C-G3HTzQ_kMs>6G&xjQ3Sp2Fv`|(@fn6-omsFq};XS|v*mL=+6Zpdr=%SBJ z+EI26Y#1v|_m+8kj~8P<0j%^Prh5tlNA`%?HWcD*Bj*YLv6n|O{?*4x!gi~1(Htmt z1{uD06@dT^W`4pl(60kc&L@R%wIK`|qHLD@=af<8kGHmV2vu@~+rX^f9vg&hb{lO` zIacx*PT>|>(pu4)F2M)OI--PP+GpD9bxsA_Rrc0J_eBO%0Nw$=r^8;DjVd`mTCKZ|O&3 z!X6p{j1VE~N*G&Unm0l44@iHFu&`?&ut6zu8;@!E@0r$=v)ElW3N`B*NFqs8d2|>v zJ_)=&0n-dEj-La?xi8DqkJOW+>>os$Vo%9#(`F2oj%d7w;;PR0=cK;h6zZ_Y#Nmqg zZG?0zE>zp#gC>=B*@;3MS&%t)0tj@s9Ihtu8e{~q^pY)ttIp7ZsXdm1wdAQxKUjk^ z-e9x?@Om${e4TU`cJB^3sOvrk+XMtTQRs(pT}7P1jHEi?JZ{udsNg4VA%_C34T^8Y z7XuY&$X>xj=BUsytYk)jshKF3q_$#p%@CM-cC=OPWj|EkEK{d=lNRPvWlqwdW-tlNpc;r`bKRg(L1B7vET=oqq=JepjP+OpqU z#G70O1W^sV5h9_QV99X?4B3!bvs$EiwTL1v8#5{s#I16Hz%m8KTSBy-ka$2`Wwqyc zdUmMXVSWvZuH>IU2I~XOIJjJ}9$&vvtfg=e9K3E1{t58C?rj}LBfZWfDyKC_T*PoI1-_=d~O zQzQDnq@_w?Vn`BYH>qVi#!dJ;fD&fIXkp5CNavGcQiiZ`UJ?t()LxVfZvD1lIjjhR z*70!N+~Wo`aKm$P>srB+=yhBfoTd(@Gw=%?3{cC!upl8IIcQxOJrFs*d3D$aF*vB) zdjq-o&(}#X<#0pD8wf1qWdBY~w1)rGK|YZ>Bl{C)1c`ZC-*5|7E%$EBFcyhbSP1QC zU%Q}%r)v8ufQUmlUQs4J$*J&rTE9m-<_f={2e396EVSf8^h{HF(`!Fw1` zB=Hz`p!;?s6PKNn!|jS7da5Y%pye041UkH$E)7MQYzPu}d|wVN zh?7{~Kn;n5CH%8=8$VB228KA3a3D4m4GW?_Wfp& znjxCo{ZSlXbtT|nNv<^C?HozUJ_=)31jat?ib`&XC=C%aOy8mb-6HBx<8?*DieL;`!Ma z;oH$3y->fDso8T~O_Ifc$N>;Pn1lIbkumDDFetsTnv4lU78a>mzif)qnh2?URXql- z)X22|NFqmZ;5DBZaEptj>yY=xD&K*v6W}2XK4+)sNCnkYJy8VcsK4OzFol;|(xCp* zK)zj6!GJ0H>6~^Fx~T2B5i}D5kQQ)Vzb4i=E3|xDml(C!LAKn~?q!~T03sFi#fDZb zlX+u3xQo){8ni7*Tzdkl-Hz=;FvD$6?FzswE|x)uS?}|KE=aH3lK(GY?&zO#MQCT9 zj^3^0QTZnrJKwFv!X@pt$+yBhYuMnIzQiyvGg4ncloR3^YIxVPehh}A;e1K@)~gCK zl9U%vVcsN;hs_dvt>G~9Ox&JRC|gx?(!}Id1IIKPK>_EnFi2`8O*$_SC}84fLzgeg z8-%T9+$IJT%B!T}{DdMnCTb%yLr|tEfQBoCjNrtU^A_3A^Fhm>6-ZD74@S zh|xcWg^KAJg&bxWPR~~kEvAXs+rUrr+JId90d>$MgGrb_BaY|+Ekm2iaWD~!YB(AN z5{goJsA9y%gRkChj)>`Q_hO)2vpf{(g-jdUU0VI=8?a+ap8CLf-P;)kI^@FBVV(Y&OALcmkEZ54u280fuB~_8Q3ryk4$C0wm39uQ?XIki{9veyT#XsW%rGVeDU(im*-|f zqaUm>x>0&JU8`>~wK=h$xaKSwIPOX@tki*{dD`8-SLW9QI!C#r4g5(=+?D!o>qNFw zM#4V}mG~c1%Z8Vvr|96UN`A=xHyhf&0JG|uIT(*5Z<8N{AvMJ)v2TwYWf9*##4wK505PefTOwd2$8)^WeT=4Z{q@q%M~_HLarQ9yQn ze4v+XNPW>*sXWV_YOgg;|KkxLZdijheMY=cL6_tDCQ%xS6&h_2vt|IK+|`^uwZ0r= zNXjiJ0^(MjaoO{9Ah7jrG&LfQzNt1>NHWMe?7pBuR3Bd>;MQt$YnyjRHsBDe<$gu2hp?i9ke*tHb)$Nxy z*F*ml9xkQ31uQY`2Z|ii)L#a3etNCGBXj#!SjLZ~gcx+uYf{pc+mTI{Qm=d1FHs!T z&o^Oz0ekn~nU#$lLYi+jUDVcWvP3>wLFB2J_C;N8zxMMzi+4Q9==N_8VK=|HKUzw9 zvG^Ads{WzMd8ZCvyGmU0~f=Jn|CDF zlpSAv3!P-v{$@%zcGnLKo}sWae5UGuTEdP|WYqqR4l8c_{m>q5?*wK8W5M!wQ7VX| z3xqToRmW&a#QZj>Ar56K%2O&@!O?>dc2S6v;lctXHqJvC2B$CtZd4$Co=@^Jh4gk_ z2O$nU6SeWgbUtL|x)F3GuN$}ADJ9$cMlXKT#>7+Q`Js1f$3*y6xZ~24=7Al7udK9E z>{(8V%l(PJfZO-SM*nMXLT>%~PX2SdW9=v3l-G~{-oHhuH7y59KW_h|_Ce@#@tDZw zf2#kf^!a}oPm%wmTjFHeIP@+I&>mM>{aP&ljxT)o7*wxWbzZf!We0!bQT>elQW-I_ zZDpc*m493*IXX4socjpyBo(EpzcaP5EmEyjs%Soy7&G8P>O~esr-HunD5rm0m-sD9 z`)eY8PznF6T9C$N$(jABne8p@sSqL3X~UZlr~kYU)()#ryu(-53W>`H#9N;QjpIu3 zzvE^P2A)6q@#Ec<{H;#)$_O=yqn<$R{jwx~`VhxoTV6uF`6IieAQ6FWulS_=G9nd@ z44^B46LD<-XvHi-Ik~%g6R#?X`KTT(%8e=onOBk>8f(H$=cpL8YN}OAxmmfzq#M(H znAR(Fpb)S3>wDZDw_$+Ws3wSNHAZ}Afb6~>fdxR{Pt4LM9VP_w?hbszB{0S8hcX`x zfd+YSiTw4C6Ii0wdenOcol3eNrGE+oGqgU;f-u(EF(%)%O0j!l{wL>9YBE<*vEhp( zCx|mNuqz!lW_r6+_l9vm9_4U&MS2xazfsY#RbX>FQEJiK{umxhKy;~s|#{& zrpChkfa!7KU~-z?u=```7}wfO{XYBLCVRb^@SvznnzPdY3s+A z@$$P>4F;W!Er_;l`E$@)!(VOrI|#0$^4O^@BFKDEv`@h@An54vuNGZL1*}o)P`|33 z9Oy4#SSS0)J)7z;fRrKwU=JSxiwyQZ2bj;U#rY(~B&FRDKi9Oeaqe0lC!)i*i{6Qz z6eE)`ac6SN`;S>7dmb#=yXQzqD6%JHEU4Zc2>;_P>?jN6xZ6s7)pG5YgX z&&Ughjzp3?5MbCrYt@F)7=%)e)GRP833Vt z>?xzl;j_>pxupZGk4L*j=$JwonK}M5Ntcq-Gs5$LgYteWh;0qih3yryj*?qTsmA)( zGY(8$M-$_a{Jlx)EOY%M4~fFpg!;Q~h>YY2Pix;1t466ebm&hn#L3&paK$a$$3Hhq zE?3wD0K4-*#fGsk^9%H)53!`R6Da~9;%z|11m29yaRI^QMka2)*gibU4*eHE?e{N? zv}^*CCewQm&~Ss=-Y6no|H&*jY(S%~{4Zc}^>pX{>md8W{Qpu#&K}$I?)}Vb&Z2Gn z!1?o1q-d)%tyn2iqJO8^kX{Hym`1UD;F4dw(Sb3!$My`XHC+&Znb#D;H)R5tdW%)b z8)(BE-n`qedxYJpIe444b)&Ks22NtiR82LX*|agWJ-$5L?0N0(a_AazKCrkr_;Sa* zPoeYO%SX$rzdorCgz7F_lw`)Vx3)zBjy~H4L~MOZPEk|Ir0Gqam%2UJ?I;4Ll9N!K z_Uxe`A+q?vEQ0c*u$z!ni~&+oUQmHmDS+#Ul=UOMATLXtxtn5G9F=QbANlwNT81xK z+_PjMTn?B!dER?Pq_!ph^3TkmX`2c+FkxPzCHo=4QXg%T)I zwBS!HytNv8U6Ei0(fY3C+_gmzYM%p(dPeKFgPjdfr}z8Xdgd7xt;z z-zM1Ukt;6-qx>V+VDADt)5YKY1^DSbt~kqjCkO7}W1ZUm zOy~s!DVMY8AQWK8^UN^q&tA7GPes}6upvX4SDg~<_xWlk5aAtulE&PNr4Tw4lgB-e zxO|Jka8>d|)eGESoY)7&^E?_cHYO>iFIsyn^azkFsA}wNJ3hTx1V9?<6=hTZDqxo{ zN7}nqWfi)*(flHyCsz7vI#L(E9O*)PO}G2N?)&e{siL^ zaL18tgWRjz{72NxSXgDINy3x9~-Zcn2B3!3-Ty7Z@HqhaV_^I^`#>Hi}G7!39QA(UB3;uU{Kky%kaAA;0MAqF5jC`wRRvZUJN z7*5F5iJaHzF6zvrXae7daKrd{hNrEu-5$Taxd#)sEuM7deOXpgda-l*U*yWu0_N(S zn!|SaR1em>Uj|QCl2VEpP}boc`^z; zz(HQ96wlv&Y2Hp)P`B4Le$b7hCKat;ONqbVq4k8nSsb30(J9jF!7^voIP&NU0)RJ8 zpSB_)Sx}-C+MY7>VJf5nowET~@1 zgiFU^HqwBs7R=E6$`?a(T7L{~@L{!Iee6)H%_hHSr0#n_{k{*N?M%CE#pIuQKP07% z77I#Nvj^TB`?+x-(;?z-1mOw=S>*ar3na*`+^u!9gPxKOIjmBFpaCvs}+{NicE?9eq^D`_U;jX7nK$A1SzS&7?&4p|8jY$m5qw@yogml z=C(w$&_}9TBwI*od~$jPWA?l}`F*#EhyDAv6Mj_PO|=!pRe7wqt+sZRo4GG~J;+i$ z^&@5_Q2Wbm9%*qst$|0j58tOB%BE?3)}#Ul2HPgsIr_$MQfF^^(l7~Zvq$+nd&u*0 z+Z0SRdsst-pz97WubBnjc~SKq?>QGRawa%f+6qAnB` zj3+OJu%=7?B7!uuqcfvIY)1>DfTJK$7VCo=PCqZ2bZaX%5yvfe3K+a;VfFOe{Ev-A zze^3#BB57ToLcsHMHFOacKSwjci1Dm$6Wta2R3#PTUKHZ^SPrMPE-Vizv)crres~= z{23Jc>lt&zE2+6m13Avy>a5xUqee||c~4eJv(+b4P8zi341a7}jSwPTRlg~X@L$ua zh5@?ubL=+U`2$Xo2g&i~SdPnEOKszDN=N2M`I-`{*;2jYaODF{_!@F-S#HZPplxr< zCud)C-zELtU5(dDHQF6C8Wh8pQ7_rxV~4x%X9W?ckD6m(Eh?gb_VW@SGR6tu99#1k z{Ylaxp~L?OXMC^95T9-LBsH$8s=TV8beU+FSzDd|9FGr;U;g?BAz6^a(SG=u5`1ax z86M)}$TJ`eoV@YnjZ=+SL`=lggMuFng-x`LZcd#%N2fiDYC zOQJyp;N2Usb{_>}a5inj{I{10a_4w&r9|g}5WVbP4LVC9y^^Lyce_okaVZ_CdfY4G z0&hnhgSQ_xf-UGLD{G(il^@5ly#;X&g4ikH_ncw(_ohnad;<*CjvY;!l7s{ zDyHOge@gWsj6slA9gpj5W#rg&iVKCDNmRiPM;&En4Z^x4=~++Uk0rk!(%ZCo91}uN1}5R1{oAHe9r$+=$GjcvmzKD0EK1uoM)cWe ztg)+QKV!vskh_+GR6kM|Z0run*ez~ufq)Q;}@Rt7r-ZR7b-OJ)qeQ3f#X3>k5D-< z>RK`bg?f;N4K<}3Jk3F?7%dK94!NeI0{I<7s0(wO0?+b+h&3&lYPd0k+WdhTV8*Jv z{)CI`I=@5&fm&HSwMMAdv8O&j`EvqMM&-rDe<3v%YJXxT0&j$T1@~l?OuP^YP~qI? z7}?1FI&tUKOYiEH9nrbHRwu!S7Nj8F&e-ySgG>)&HZnCI$fO{?GG8hiW|PKY6Z=ie zM%mzv)KU%Llx&>52=hR zwZ@KT6LqUh;}Ah64yYz;|A+R%ji-x_0!u~2xUP7kSPk?q3fbs~8_fiSVg8^G`Jc57 z?|0qp>7$ysMpiv`jScy56yhmk`r?LfbNp5|<*~bGh&vnOG8L;%=NAmd1N{XMb!p_6 z*7ng%$u3PcPmAM$Zq+MQoTF@OJ(&Ym@j6++=9%L5b6o#wK@ouN`i1ovgZ*E?$WnYJ zchTseO_z;qi6OUVr~MRKjd94zyuGQFBhw&9qe@l*?ug`9=19XZ4JWiaIUCGbeeEdV zk`qA3NwD$1q;1K2yb?6b6zoqbdfPAXg!S}k9nZwW0_qck-vnK7QL3}G{&Mitlt_9u zj66dh45MzDO9!52F}(bQ7Sva!)W6b9>k8>h5~sU()(a)^3~sXBu6nYTo;&)e zPQb(f6=kJ6{63kD_$Nb5DGzRKE7!Fc?4f<=8>;9Ps;6GB_cZ)mNBRwNTJ65aPccE& zQYq3OSAUpW?}n>F&}>ON7sp6f4fNzSgw@N)Ctr>7i!982usR*lW0d;=WFFxZGQnqv<)9* zekawkT`7*S2fA3PG8{Bw8<(p#v>PqpF`KrvSL(YJ0 zZR6-e&kv6n>pz5l(0z-~`CXV;;OwHkN8``e{jZ2qu+(61E>4`zb&$R}1uViL5!5wb zO*=v^04IphLW3 zE9<~Iy=Y`9DK3uu7jmcP?s^JV;(4D@a+UBAwy_17A5%Yn7ggSn|`A04blm7dqqG(dk!bhvuXX@*g+NP9*^hJ_(OrZvT4} zA;sQ_o`j@ww@+ZREMn3#nNntV!7_VU_Lt`Ag-RTtp+3GIi>&SNoQLgHDf`t%uZ0lr-P!r*F2i_uWkJX;~XW>mN8g4d#s)u`7O8t5M6I z_1S30R0g!wM=t^cRr@X5-FKKYO=0#TuAaa=k;K2@Go7;{S)?p19uMJ z$`GNtugMgtrGVvr)%&u1MUB`<#TIPU*0@RK9%(8Bbu4vEcAUm8fH=#| zb`wvh1To}*4OZ7~ZhMOt(GpJu+`6cxY4+;q5PdaPXZ57oZAIK@D^&2g?)zuXLN>-e zI?HN5osN1G9ewBZRoP9P^*afOc=_wd4I3&(g>beqDIKtAzHqLI@9uK-;X>A&aB52I zZ58m&Z2gV|`y&Fb(s zVQ88YvEMD@?HAbOa`faT_{#@8nM17~0Pf^RoHfX`v^K+qax9g}h28-H@oDG;E!aZB zk2tm33V~_I13*m=PX({R%?KNfn`~_!q ziKAKSXzF-Z2!l*|7>u3e8(dBt${eJpQjo1ckHT~HzKqQ=*u1o-)OF8Oyr~O{!SY%2 z&#G*~Kiz^t5|e_=lxMB_JaEfjwy1ZiV@~7O8w8$Rq&$_LNHOjbN*Ux7oi4pUGLQT1 zM~FhWp9TKQE+^esf0mk7pS{)D)ApIaf~&|&b4FurE>Pu!?eb)e?oUbE@LILtp=q^KdKdKHzOwBj1@G(`_&%CC5nNZ`W&Z7nK111 zFP600_$xQdbTq!DX9FeUUf-^crOo+n>ZFIbWHu2#+qE$Hyv{ho*9!a_VUUuc^}|HHYF+)(ppshz~m%MX~dn;usG3=>k{~QfxZ2 zoufJDC%0@Jx#%+vF3A4jRMr+f+3ng{87JzqK(H|i7I0(3^njbs?xGDo$4;R@xKMuL z89B_XPOl-i@tF@Wh=(QXn;=CCzEk4*s}b#Xm_m8{_=+OcwlUL$dE$gIRru$@(aDv+ z0Jbamrbg)HGRn*Xler75)$w&44dCa37&+7k)b5T>q{a>e+~o|$mEYyr^WHw> z$@8G1d1{{hLE%YOTf4|u;OlyUG!FgC$+dEaP|lV7X~ct0&V2G-qcf+*m79Wq0aNGU z!1Ccz-?jvU^h|EX)rZf1bsOp=1_&)HB@4_C6}-5UrjPQRvu?fN$7vk9iN>GiRa?0u z_-SDC&RVKk`FsJYVxwPS#T|Bc zYvP*7pXG8mIwn{oxM#Nu=7p**&ohY|OsGISqvPBt7QF6Wnjl#l+2aW=Rl_x-tT z27^kEw?5q%2n+1{6V?XAo|9b}>vWLp?|0$~X2?_>Eu{X0M6D;EPC^8(Ve~A1jL(gs z096g&E4i<)qz0~LEO+rF3Cp4$dYwrs)tNZyi zS)9c*w!?O>gCaxT?dlM#*ALrewNbYr($OXN$MFs;-;0A0Ya?GjvM80SZK`JdjJ_Fl zq1g_<3J%>dU18${)-!cf6R@y@XopQpz_sHm{i&8>skh= z?gyyzNkz-l$Wp$VUubBKJ|*kE=+)PM-nK8VE*`aO{{@(HRV#4;Ou-4yiX}RvnL|go z)Gk`azhsPcDr^D*!X7@+fyl@OuO#;LNUHQ5fGTIQd3PM?yO9>?|~ zNqtzIR3QP=k$X*P48JPW?hvZ0B>6cxc~}@X+a(kf-|Dx3Onlx3=N1&C_!}f~Fh3fy zX8Q=jj24SW{YG0TsWNZ@ODAv^%CE>Wj83dZ9wf~EPoVZre3&h)-zwFeBNmrA8+w+j z)zE+6sY9v&HljeVs8}|Z&%pWJ&BFSXvj_Dvo-Gwx?@=9>K$}TSasPtHeRO34^q&w#= zND#&_FFR$1eAD3P^itZ~_J0Szt=APb>-+GN;-+IWLR3ye!lJ1D*X2k303PgN)?dJH zF^9D9;lWCX{RG!$qs@!0wrh%;04(9tPrS>)Q-mJ}lpxB=&J{Hl%A)h19I!$>_8m-@ zlBY3Mu~RgoAYwQF-HU^f%?7&_A`7SSRk#{t11AN&-}l>%Z4?N0b3vb5@bIt7?IkO8 zC(P_m%xNW@a}9j6q3;fRmCaa`l0X6!-2oR77b$~x$*H)z7Jb-n7T0=wKA4Bjom>0z zLf&-5FX2Dl708af3#?n1lTKaBzVS>zzq?vc$c8;^&Hn{c0V8eGgk9~E=?D+$K_`-7;r{F78m zg&Xe zqASZ*H|pz-YKn_s!BPmD3GPqiWB0SAy9g6Td}v1YkK_55&PR96p~PNk`zI|%{YA1c zj$hzX9r|2qk}TRQYErMum|faYx{lU0}`JW`Le@>sXMInZCMV1AKdrpI`ek95CG75gvIsQya&*z)!y0JxpI#dIT zi@et=Gw22wsx4}S7q-2VP$bAaB)(_ZSV3_OpV*aL7YE$*h`45U za-!f<8pf)^Qf?5?j5AeZ!6){1TyjPfSKAJQo6fId>w09`3-=lW9}vbk)@O}~zaA1q zY{O`wx#b6#Ql7q+2#BX8#aleMSKFW`7~@e`STy#2+uqK`8^Gtyq|0mmVb=1ge}}P$ zQwn?v*VORr&Bs*zG{z!2H@XYxJxxUZ)c< z`)NZLpO9wqmC_vM0b@qUWoeYT9(}V`WhMwr)bmYP4|e%ana*#cm>Gf! z0Xf&}AK*8&G@oZDO=sZx+9^XWQeKhF5lj@PYpO z@dl|rP$P*N{<=!5V=HUh+=Kr@=)z1{)#{aE^U21E{`0nSFVmOqwk$8L`oCZ3_W7Jz zly)x1H?ZFN-rnk&h(+~=NJ?)Iw8KqN z@V&==;T5#!2oHoBHdx+Sy2cdUV_RFlfBp%V(> zEGKdz4hzKSfW!cc+8UbW#4ApJf>bd;p`SJrvZ7gR*ET|bD(8udSGU|KejpcO0KB!7D1{@(X$dw#U9;w#Nlc-QPL_~=n<>>oR~T!`#Z+NY zxGl-RVevrz9=UAYO^{}Z^=5Y3J+&&k#h^(hPAVK0MQM08Jg|V`HqdepTp&%G!D&8| z9uYXTq{mT6fyqP6jX7T?se6ShN8(9rm4hIkdmbeF(oQ*?e;jBjz~+r~Xk8iO^1KL} zf8WsW2Ace5*#=qPHF&AV`b|6>()1_r3r@M7)%^Q71e=n3jm>zF2i*yEtRO6Oo9tgD zBFGf<9d|6?o2g6=3;rg`S1lYr8!QS8LE~bB2MNi~UvaSq)+on}lS$XH3JDk)}6L5AVo;TA`Kp$&HURuN=T*t>hTsN?;gz@x?Q>;^xK_pM9< z6(je?shOstW@nhc=!saB;J9rvjV`-ywYM=$_FHrM*;dO@T@0^&i!>SM;C9-r8p^uf zz4hvgPNlk5ABW_}*{90^ZxPsqYLQ3kPHHx8f(qw>$p=j-4K?v8xA0%JI(WGa^`_)Z@ ze|a`cxF=>qos#5yvOk8A2UsQ@0ZFi0<9$zcKon19UALBk{1dP&2Uu`*MN@f^A z0At;)=2&8Tr@EV?pHS!VT4Y8@(`{@bt-EK$jNFoG5y@3+_6b$uFy1^STkmN7#SWK7 z&AJA;^Q(UWzfO=5e9^e52Q2kmt89}{Rf?t%YtsUl!@85>u3W7Zjw!(yWsHal(q@t} zcoYPvcx|nd;@mf^jxZ$7a+F{QE38_5GdyNIby2F~T>k$l1jR6Q$v_essagbHaUw_SkvamQ6iQ>4@)~H6*b%*xs~&9>l?dF~#}*foRvI ztQF42LD5+~WIkEE{6X~8@Ay}=KIPlLl!Ol%Mo;c`G~}k zXM)<_?FOe}KGB3Z?1(R((A>M|C5+Q;zKtj`oELE2()-vm=7UztM!A3Qe){X{3R{F) z&dAZoS7(y186b-E3y>Bg@APj>J^`YQS z+?OM(=z-C(xA=nO$>>=Do{z38?;?$vd_W&=>7%0y&US58|KquIRsY`BKK$j^<2#E; zgxmK=iOIV^){wjBYYg3=?mEWII;Ev!-|4+u`wPe>P$g7G7cT@P?L;=M|I+)obl@gP zm@_%o*L^o)n00?R*s?unER~?k7Tn+?l_py)zL+IG^hSr5kXom& zX4(7~kN>P|);?NT8t4jUAzupow4Z;t@YYYO{lyYj9G^X>*4Z4R*tK6J+P7PZ33h&! z6~86ESbvp#Pu%`;tF7iQKsyvIJ*;e--rDz}y8Cb`SN9LjSAi5!29FV1bBThuU<^hz zDjx8*g1HN^y|4CV^D}j>28$@LgE}@<%OhV1IA2A;w^L}g)=f1hbb1?*D$D4OC?hH9 z?Tl7|e*W6^g*sh^w;&}if}tFPRib5iZTq)WNvBer-6?tWmNYKl5M{Wnz|889nn)Gy zI)4bnDsAh(5zR2(5MFm9*splD4S0s(Uw9GTR5|udbY$Uzs8BO$)K!CN1;iBQgZOWfc(wy;J<*S<>4tl zJ&|qh+Iv~vY|Tqw580NP;hNrRo%a_QWY44{J};lqHJ=Fo7h3tQH^X+w{737pce<+s zcLRUeg%|((@R0JxUwfB&EFjTLlJELD*-gsIYEG9E&Aw-wxe#wV8a0U_`pb^=v1@e$ zV*HZRlygiHDVs(Gvy|hdSUSB23nRPDX+|mGzlA2f4B~wFR(iS zZaT?$euz@BcZvCG7UTP}xUJmvcS76eFQQZT`sM8Aw@0JjL^^W&hZjo^b4Skye|@FB zlJg@%;mEOA`MySn^jlwV-pHwMgCek2T<71o)t{?DtFCa$EKszPax>$6!(3 zGo4mdiCYOdZ?6voK%|Bl47T5vG;ID_c>w@DU^xOE@O_i9x62_Y1iMa3#5s4IfW#SS zo8%q`VpLdQRKZ2)miI=S=Qe{%IEvTBp0Z=AsdhmutsC_BauovS#uK{lt{Fc1WK-}o zW4lxJ>%+J;l>32wLTqM-3tnX(-mVgQA)#{PmUmC{FL+5H2Bv!@(V(N%k6n`KJqng7 z5xrIVef)dAd&E*?ijGQ)$Bp?1^UmHa&jZ$!P95cbBH84Q_O6>b-Fspw{gPj--?X|~ zpvML$7%e=R^MduLt|+1B9*#!8TRE->6>@G!5-zWV*FA#@6SQ&*tYcU3syiPdj@(EM z%frYv@1GiX&XM+k-XQ~R&crdEXzC_er-nZk%_=IK%h#)g?DCslt#t_pj^i)Rn0Mk@ zGW0f1u6e&sYCX$(r86hfU;`Ui_s|{a5rNz^#rV{WrK1tku-?>mf|S4{^Q>7ZqI4O z>W!!!H+NZ+gF$1jrS#uFIDXIDarV$}?*7|HXS!D7j;lCf&LgxQ&YHe*qd)aS)ct6a6)2uM+jnyfUo z5sP8q4~nQIt*OS zj8`>q07#&(az$ae`^IyPi*=pjrXY1Vm1JkDh?`3h+i$N~15c(vcrzcwE!do0YPieZ zmhJ+-CC<9GyiMuO+$8BM=XDfTV`K@9T1WEDiS6DXQ7t{5UZFai;i zH7oE%7)}F8C$~4vKx5sP8jlH5q<8v>!7Q{wal{>h+M|*dRw_?q? z8*lsr_>OL|#A~|I-`L2+O8omne<*raY;n;o%GIkz)Bpm0rp;CIi)(eYk0XDNwmYE+ z&koSz0s5wi5VhXt0g5J`B?CZcRn#o4(uhhJfYsERRWWq3i4r7$$QIExI28&es$ov0 zX#sLcY|bib;iR2ZmKc;*5&!^Jv~&wLAivE@BHaf`BL`WnL_GxRkfm6KDxq#59w3Yg z%7Jp$sS*ZCV9oM7DINWZwPPh3l$R~twn>dhz$8CL-{BuJ4Pu zEbiJ{8}~bAO>Iiy{6RRb{B-kueqYOL6Egq|Ya>IK!E}!;X7)G#0OR33yx`wx_sEPv zFQ_j)kDWhE_xXo(9SD$;LFTc09>Op2m&GNL_ z+7Pn<%m8(co8@n|xh+5srxLQ-+iy?{)u^>AHDPYs#2DgnT8!whk7)-l$r+@PBs;fH zf@uY{c*Uf1WR%3XUhc(jSizz}4T=PuS|t3IaTMIN=O8VD&qBHP<=3AIKYMd_J(=w( za)dqEN-)-HBdD{opPFc%)#dDRTn(N?Tsz)7dENI~u#oT>DVWzweq(8|+;RH$^Aovl zFA3ns6{{vBwQud)#POCcO}^#9tH>_AdUNVBKIq+uaT~k2?k6Du{{T^C$GY#wr2hbK zZGWfXY>>iC30mdLx^DV2knLtA*ibDbSI*fI5{Yvh4@DPFwf8}Z5qGQQ=20DT7bSQ~ zOu@^l2Pz4x^H`jZD98ZMoc`+Ry(cm+3{AOBxD6Gfe4O; zoR!yz=h)lpx~UT9piYyRjcZgQZr#XIJxRf4Ev~;CHuqa07`5q{%H*>;hHGeD?(RnM zwQgVt);^g%Q22}-=X#G4DK<-GhVCpCrgn=1mvsNMzAPeTDXgS6j zUlPS;h{IDbVsk`Q-P&Baxv2V_c?BAZ?o>-}BF-EZAtO-(Z*Jb^$(8R+9zs&cGFoF7 z%iO!obJlpiI2l09eZnvi2D3c_F1$xSr&%7TB_V7$FF^hQc6d6zRk!U%;S-2!kt`+D zc&y%azn^*RO@M9OZQGWa$PyleOUz=pUUBT_xmsP9E@EeAay49qB^-~4R&|Y7!gF!A zyXNlQ1GXiA87tM%X}7Zxw}>VBE_JArw}CeUkp2oP<75P_fbK>mYDR5Y*=-;bPN8Xm z3~3{tAyf!B4$UmoQh;!5Mk*S0tBpgG)m=o(cTEG+Bj&X#REv_1gZL)0sutt9-^Mrq z=3fQM*H2F`{^{~tk9K{}ZEd#K4$2ZX=elNx-4t;z^s9Qv*W>wXeSyZ<;C-*Q;h`}* zR%2VHhD6px1LCpIdcTwI?k`{D4#Q?OSibt_lm=;+TE?1JV`juQwo6RJMh7tlVAHLd-=W5nmOlT)OgtZfb;_xiYVSThhR9 zN*_y*S;~x?X5^qqB)NK=F-0ZcL6iE0Vk%is3)jfdKpH@D4laa2zkX7}PBUy6DWaEq zzl>t|fs6PI6<3>kvyr)e>~^+mcJ!EhbNDMFb#e)?*+Xl#jjMGK73-+tS6K1&*4J{J ze79VD;>~akcF&0Y%GSBLRoqVKkrGH3A@rYD~GN}BNvAEXQ+?!Vb`Zo~0n5bK7rb8*RIRB6jB8 zq#l5*<66z|e*4_<xe+T@8tE07&3WGWb}M+xQ@Odhu1_N> zlbfoG`xY7|B&@7R+uMv-97bw2s~wmTEK81x#Hsd-gn-0kw9QJk99QJ7FoSZhg3ysV;HxPtLb{@YCD&_Zw_RGBdlRF*1=`oJhs`S{CeV_A!ih)5O7KkD8XOSMT`Z0Ql?jCv;V<(jyuzI@GN~GfUm+s2vA-ap*yZ+P;Q0hF_Ngi(c z)wqe19XYd%O4E`^g#>i!dOiz9xXp6AQ^#^KzYyDf$s{&0mSJP4^nAKoaa*uVOim`N zm3kWfH+lBJ)ix3s<3$%25xp4`r25Baf`Vq(aUnn)pqXyuboPp7F+@(XOaWs3dtlQv6ClO3 zOn9orMYFn=%bbL61{b102dcc>EMIPSLRPfIF*t?OtKrH|CEH!KZ*FHP0Ay+&sV{=Y zcig*92avL3$cS8wD+v%DC;cUJ>c>tcLH03}cUzlVc$jff4QEj#>KTVlTJAKK%!KCN ziPU@+oQmy2Raa9?KpKruBqgb%n5jVcmzRc02Zu3i)k92eCN%qE|MFFW%2pUE}3Uw-nM&7vM;qp-twBAn@)|=xKk-kr z51C7RFB8hUh_iC!V=I_T4~3~s0jmM2o z!BoXZBPQM34cRb6ongL7#$5Y1B*f`+pcPidq<0^3+{@M>{wZrSl_u|hwb<(3ZfC0I zLEQO7EZ0dC8+%*Mdww@tuHCc`^5K(y)toKHqSo3r;i3Ve1sO4mLcdXadZ)PM@f|KL#1LQUqce`twYq0H@VJyMK5#*(fbJj93p6iU?e@VEc;z74R zrg6xHit*0p?I`Zx5GT0Ek;*y}3uYq^v5(g)JOxLK;T+3vLw3W?;|s4T5rki;5S z%~VW=>Tzg{CG@orAMUsZ33O3l_V2=QF`sn~sHm!Qe(xE-8@mxE)T9N-3Lh|}s@3fI z3p>aS*5AG}{{VIasLU>!&E+$7v$x7^GaEs|#h1%vE2{M#w4l=M@_y-nT3B{wb1wHE#^g!?I0? z9lqKk-J)87m?<(X^0TurA^k&h*AI?E z;=1!3zMU+s!07}EVBRP8E{`tg_U%em;z1FAQ+$;{j7WoGB0G;%2Db>pkv^Ntm>|Im!T_B1OX`;l5ohTqG6DPpyH%8aDN2Q zk~bqL5!HwaEJ&GsCD>pOh{Y5+$~OUo;tzpYY9Z~%A;s=~{>+(e$?vtA)GJHJ^IJ{q zp54#s_c$1u0(?T&vw2#^?&^`bZ|=l>R?qEQ)-EL3+}*i0`)1s5d19=r*e>!~tq4EK zDn(A|p+QJ>T)sryxB}Wb~@bTCCq$p1H(|$UHt(Syn^b9CWW8 zQlzZb*%-U4I>fx|N9?|K?*9O7b78u#A+!OcfB7xoCFV0;o_g5veR#^WW}J=;C7?De zt&TU^yWCu)_}&+F$OydbTGeZ&qI8GyGE00qan9GB@VmHg%=a7l{oUQk2^+=rRKIjCEpYpB%g{Fc;xo*Jx0N-9hi^4N*a@)s zDOyOiECvMxi(~-D6F6TJUbklB~c#qqDgUz&2A#jXAG7qh4&jI(FW-fkvKjJ zS|Q#tsL>J+Y)9&YuS^R9A=~O8eq~)nR`+#o7R-YO3{EO53GQA_-J4P%xvNoXM7JWh zjoMDu$?gWbbZeRMA$OjhPWtkn2r;+Q_p;gNYu|h95MDHK#qXZ861Aab`H0 zHZtg-k!mp|u?z?+NG6DV*wC?)6OdE`m*Do?uF6|$p{4`cy&qI1kp)V;++eJ7JMJTY zbB*8j-LyxPqHvUaC5q+OFK0dLWx?`#j3Ou4Xa}8FD;;HN_SfSbC7IkZ%B?k9&<$iV zMsXqm;s}Xy1$>YaP@JI|upr|Qi=oaMCgTo@R^>_CNYECodeK;kGT}Dcp6JIxk?oMh z{ME$KEo^zsq<{7ITH-#L*W^~DO@l*w?m{%1aU^woeoFaF{zYiCD5MO0$QmXBiWkg;~Prj6fMwtutWokdV%%jpV92539IT z2V>@llLBQygW=b~R36zec>n`GD@j4z?%q0bIJcV3tISjG4y(F+fGeGJ8*jH7Ok%_< zB3eA6#Fwa54UNf}5Y*~{WW+oTQ4u#oR184wIH^`3n+#%0=6^(z2=! zSB?ai0mvxR9d7C2{l&4~Tak!2MZ3@Z7Y>FSPLVDah1yEvWe}_B;q&w;yMd z<8N{MirCzZGOiMd5(mk`Sl1nSQF}v+;`Vc$lV(45)Qn_Ea^U!`7Crp^Esb9*w1(qq z*85BdkkT6hjM}v0Oup1#8UmOs%v>sn_h}~>M-?i;t@Xx=DrKsH;;S@!bfTcT-?alJ zFmtK^U6~LkK8rPC9m|BtmRiHDN+eWNW}*!OWh&)?RT6EA3e{>ePA)R|r6LaCfJv=Z zD{%(t>5o;4p!Xi*erI+e zVp5Q3mmmzvv20-M>*f8$3j{vjY(Dkzl|3=|mD`Bn_3Oh&cWpu)+h1~AVUpaeVqUpn@>)zNy6y;79XW|x(nGxzqMr4E z8CB|L~Sk|N7vP5bengubbRD6hdT-J14kD+F(&NC?ZzN@$OXP5 zA6wz*zi>p7alnjMrSpj>$(}foLC~C2Ol4=ejjwg?VF1AB`?dPorE>4v*YW=VmeXxL zQ5_reSaeLYA|}951*YCYK=sK|lI5czLF4dJkk~^+fa;>ASz=vO7!wnX5IgP%t|&TG zst9-P;|vvsIM z^;oUMU!mnw)ncqSONPjLlu*dhNEn(#s)kC`U?n4qWmQElD@zi2G>F4Gl`U#K@7;UD zX4S&~084;!TH+NC`+u@+hU0&5JEF?UNsFMp)k&B9uYBE7#X330V z4lLS^O6Zd-EFw>IhwF+Wzn0>5JeJ<&jqR~|%z**%fx+T(DPr?%dB@q_dv}+f!*WTn zH#=MB3ETalaPOD1=iaqDE<#i>lf>7+KSj?S+Fm<-DL_C9oCw7=7aMzkM!m$48={Ck z*v3MG;)?+LRn?eLq^nnqqy=I+1k}Xsz1W#BlM{=Dxlub*bco~7t+7rffx2VjfKr@^ zEl!6e6&n4)i&N@SswKinBo2fCu(*Aj=T?bOlTlpOqGEg|BMlUG_^nEqN!^x!206M~ zm<(hIE_<_4T|0nGMVnSBLQipSAh8;vfn$BZbJ|#zLkky2 zC0<^C#@zm=o88|&tCytb$hYXZckS%?&ksf8f%`yo&0)2qZ37KYR6(}W(pga}?!U(m zB?F=Z0^t;~mYQ`?INtHY6ha-;B3zm#s8inCG!kdQOynz(f!LSan+F8q z%PUj<*$^F58A-A~mN9Tvqct|)fuhqV-N7iT-Mg~qTZs385drHg7F0Nsr~y_{N^OHa z--;kty)ucQ=s!h82PFU?SbAy?nw6)M`|A9qZgGE6XA7qZ*QT4>duZ*rJ%j*nFonx_$nh^+s-1G<(imiUuDCym##^MjSFK)5+0L^ z8k=lHfkzIApSIhBq>oH$KvYk&ZQ$fOp-g1dA0G_wD&f$%uXW@DPXhIYv*#Yd@m<6Z|vL}F55aL4j_f+>OK5jjjtEEjAIv{ksVfR zO%~sDBQpb4Wm4ACuj)n#9J`zRSEw9>o&#z0GmOF`Kp2c0Q)VhBU$Pqpel;} z*S;-~W^c#HU;<#TpSgE?>%!K?)!oIzK^t*02jXa~<(|8dVX^jSEy-LL`N^9bLtp74 zf0-lFWO@gZ={a!k>l>Y}-p1P0EN!71RxLnA7UDZV{{SV?#?>)~xIU*eA!QCFjbl(K ze?>^aZEYSqoZap2(0$EtlVcg+eruOcXUgn)4;y+vZZ*Vaxw=@imgWEe{S~a4EzCnP z^HWr4?_dD#OJp38oB1|~ip}#9lw&N~ zr>l4<)5yK!J$J-L8iOv}G2f=|kA{t%s26C&V~_!QUq1UvoQ#(vO-6yL&)BoNz&BV#Hw(K*RAtB6g(!V;0H0)e&!M z?Q>RQ*gsSNx?%u&0t=5c5a$^QMj$($=^l-OBhNkI$DTizj{4Bkw%#86fVwgN0LgRe zJzpNT!o!K(gJ=L~S>F)2SoO6#4cU>2i|GNGWmlVfu3U^!7B=UOK%xppx)$*8R505R zkjzm8yEiBUuo(F(5~sk^sOnbOuDD!KPy|?u5Crr805z2m+KG&QqA*t(&^H?pAY~vP zz9DAC)_alL?%?ya6N3ZMVYyV7Im_EXV|Yqm>Z-A%EB@`aU~TsjYWS^VDvj4Oz1$wy zm=C3>f(GYzzmKF6O&wNsU-r3;z<;~;qH+#O)J-IKE$zVfZ`?Uz%IXRK00|3y)4g!S zVCVL_x`rLSt3X?~Ioz4T*d&sE2wRI?hq5`H{B_-oc6JLLcWWl_fX!-f<=54#;=O~w z>}MOdpm&#HO;@S`>LZ8EZyayZ)}wD?&feLE-rQ{4KTH6K`9*@P3_vA=ff|?12Sk$~ zMINMN$SG#$u+W~04lGD7s}S7}iVBW*gdBt+e`-WGn{nD@gvaoeEOg_%R_(pRdt^VS z-dmN6@C_j^%pQx4k6i9liF>lfvHZty*r?I}0REoLu(pcT(`S+)z@1bN_yt={|E z0wyqde1Ao8bx(KQ8~cy;qFCS=lk$F%<;Ze3#+gWhatVf(-rnTcl1a|1G}W%kH!YCS z{Z!VPO@-D0i#mfX1V!@+ccq}IfQCF zd)+1PhyF0l=DYC6ex8eBAlVk>{2|Uv%h4Y``%SWF37`~J6QLN^jP3DdM2mLfUBev4 zG(F?s}amUT&1~fUYZjBv?mjV2cOoXQyG5Mk=+PdI5svxZc7c^`g zP`2bj#<{8|TDak{T8z|!KHAS|hE$=n(fS1GArmZW6@CK{!H>Ef$2 z8}_XbNf3~z3(9k$%oHkccd2Rh&u z`Q^i}uk_dPd`BIyfc~D`VKI%;@|phtzZJI|)muh`0A8Txst*uEU(`u(-5o$kxR>dg z2i!P~RX7n;4~!@YtGoV)DL^ud7_pEw@W`keY&jqtY7i_NQ6K^YyG9|(1l(=5yMQh3 zZASDkX~akmfkRYV{{Uipe{@Wv3!8ah4XGCY0LRj&<~mQMim88Y>|1ebki0<3;E(9D zcxrvAr`QgAx8_d&07zDFzwbjn#I*qO-O8S#A`|fw{isLTghYL<+_aj+k%?3AzwJ?P z@LY!2yhy(f;f*Clo5NiFmRvT<*774z8pR|qkX(9qms*{_wxS^LsiQtBMbocw60#55 z6lbS`m30n#$yts1zdBR1HrLbA88thn=oeYsR1hZAt&>PYMB=r;{1r?R|1+y!1B-g*A_BznI&{i}zOU#6Q}&V|vi=pYL2gk?#1`qldXB zi^z~L{Z|U~M$cn2D8`^7EM)-Q-vQIasE6&$UpwIb2d8~_}m3K~F=L&&gEP8wVg{aFYoECDU3iV%$`%w;DMmvvfRYBJ+e$LhfO zDmvtdiIhMlj#LO|s1SQbC=gs4K^Pp+Hsg-xa@b^mS0xb=WWkOhG)1|%VIoCN8K8+R z)PQDlLjDK`cW@<4ia`!nM%Q@_%sU)`dAd6T^IZOs-{sTLc)QWNW-=ZG=ZfKvLT2X7 zO`<^j5mTvr6>j-D;21RGDs{Pvnv&-8_dQ>0n{iX-jEds3@VDxbCP>=V~BDQ zsPdn40V|H!72D>|ew$7X=>GtY+02}6#yUvGi_;%JuWMTnEHw(h$<~=mh!GuvhdlAB z3k|$Xvgm?!pz#?IL=!CwQE0!UW`WbTA{m%`&@)LO5k{yvA2b5EVj~i0WPLBu1Y4SD zLpXFqTk-}XW%Qf_Q3Q4pFNki^aa91gZrlaCKqiM05U)D^p*fdTgXIt?DEQStk({DVaqudt zcHZnRN7aTQR7tlJQ02NUL`%08?KBw`sTrb8+y(@7LL=QDz$!YaL_5+h?N?dVM4jOa zQY7b4_$au`^4yp6Bmtp~d{Ieoi#-O0d^Vj2IGQ=5r%}b9ZVNBU=^ldG`hNH_TCa$~BPYu3S7NSG;(W#P3$MTU7 zL3d^tBBa@*u%XD55+X}BJt8ymKtZK}Vo1xQ^+50_Th?euP=iOgh^$Kzd{t>mLDO8y zjFqJ#^aNmfD*%`|i5j1&r@=rc?ju!6WcZVo?^`S#|*L zC8*6wCBY`L7zJt}kY_iJc)H6)yKUiyReaWJqF#(ZF0oY#uiSe{`7+B$yP1FvR4jyM zxog5uEY$UN0UCL?xip!`f$&|pXRl3X11IBl-);W@+K-d6^vBQZ+UCg)0Fy9zM2Z!r zQ|v}2WD*3r48cJ%$dJ<`CXNJpoduPE3pN=bnP`$-o;VShKx?EiE=d`6K^#TMH5yB4 z8K94Fw6yB(B8;Qh+1&@eQwGby0AtOlvj-0$!8dP#O3}Yyg!|CdZ#qzfdt}_r_jIg4xABME| zqFKkTLnj$3jsDO9YJfxmsxcVUVpiid2Y-5C5f+UeRB9+=1I_OR?a+&YCvrB+)%8dP zdG^PCm-gcACZtA?`86Kxj<*fP9;x14Mu+ z)}-}7TY7azP|luc9Sso#2!4Myt)-d%kzWaT~FaKf@rf+avD#qHwnemLRkBRaTza z0u~|(4k8=PMXh$!lK@?a#YR@!M-jpNR^usT_Omf;RYM^I(!L8SW#K1op-Qm|^Rq5> zrEcosi8=M~S*=Ar{{VDqMqN~Cm*qDSI<(U{c!grHKHP8gIEHrF9A(Q_D<6J``a zGT52!W&y)u_%T3JEJM@;39eCg3#pzd=+C-Y!j>Y1JPt|3mKKRe< zk~@GEiKtOnzC%Rre*}pv{*VS0R#L1u6H?%6G!iRVjab~6*$1Gcexeyv#Sb&cP6lM) z%pBLrLb6*?E!O`4Z5W5wb5Q>Pw!fn3%<|*)zAI;H+1AqUmSoVf>hX;YAh^d3J}3_u zRGK&xB?F=d)Z~gj0Rf;1?F5FzfXEF8m3mOR2gGYK=?n*tnh63i1Yki06-QBZfEq}7 zD1?O0l24g#s1r@OSGaUQ)2N>I)8R(wfJPt(cRo0v4CHlc6faZ*lgJP$r2hbhKpTUu zKUaalkOEK=kqpEfGbjgg-T|GDlPV&}5<}$gBa(-;eaq)(%UZloX5u*pPBG;5=6xdKtcY{BCZAxYX(xrV*s}<$^85=^>OWUAAWK!vu`ghT7;J zL0v?lAukoA5EgX+W(lb{tkqZUor zN1R{@Y;kr(L%AR&ASF@i1q54$UE`~1IUp6?FN2U6dTv zU!v#J)AEGi+qKJ{i-%8CZusL70jZ)|gFn@Ct*`c%Bc!u}Mq~G)Eq3NVY`Ck{Lk0rd zh6h(yS4>N?T0|Tu%$k*FVA_ylEhVV*bLO`r2_n?sYw0z31BOH@i1&dnO60Ru zU%CK9hpV|+twj$ZDTqr&di5$b87^Ex)8(;5NtO;&!OR|C?hgzOXojKv3iwvjmlLEwS202qT3MpDYXPzvN7$JT!&1Ds<= z%L;Tr3B*WA%ba4_Q2>k>R-|F(f<4H`Q;L?Ya6mZ?CRmwB(3&6-wspuD&{TM!t>yNg zcV%?P{mXyMx8P%!$xf!m{&y;O1<4zmOL7I}roSb^y}bHXN`H5hlb1T21qk2p(J`|S zDcZ6xElg>MavSqd#LEt4LyD_^zC@S#A8xqaq7E2Sw5)Za=rTh3*Cx%xh}o z;7G?83(?JZdyRdKS%+r@=&PD-h|3W{A(6x2f?d5v*K<~cKVKYG6C*hY#0*UUC?0MY z^b*W@AQZ0u0P+eL;`A(l)+QK8%TOa8hzLw|9^Fk)a6lQvf&j$UsEB)s93TXo;;4-y zCIP^cwR#|ne&j92bGasr2DuZIV^>y@;T)#!TmD~py(P`-vXlP+rPzK;k56yTEx0$G z!4OA*T>5t9xZ^Jvffs)fisxI4{k7oQM`;)^clec&Yh!Xq4_#Q%1elt*FW`bztwFLh zYO0C$F1xtY3e>Dr+jl1zff-ZyP76tiHm?Z^gW?7YTFxJOAb?Ncl#0Feut6B({brDdBsyB4I0dd_9r%rp8L+pr=*4W^!Xqa+j5Ke zmheCumJERrp$tIEh$Bkeff18Gh6Er5$V``zYBOU)(E!W{c*GWLSpel~B(!KG?;fKx zB9nuWv;9TCs@&uoz!Fyup6)M#ab#ZQWOLN+v1@VY+P5DnxEXJG_o>fJ6#p7B7jeKeYsVnlTjU zFl9trguVdG;7%;~qB0-cPF@>67F&2si~G~|fx)BoA1suvpDDHF5QAHG!E&!|V%LF| zo5Dot$%R&HQMB1ih={Wg#*XLlT&tvA?XFxPITREwN`l*LZVe?7cmw%ePJL@t7Q+A(F>*BK0E6rQd9wm#ngLtB{`;XZ9y8)V0}(OJSsnpWKCJ zcTqcTS92KFH)9*1^b&A?CCjI;=X@RQXij_iNQx4`{8uXN9*?)v8)782DE|PWh)M3_ zZZ#)T%~5t7giY`XVSw{fR~NP~iO2yV5X(`N+aw6$3aC>e$HhvBTe&=1CCJ806}Y10 zpz$K4K4y!ZZZbTjsK-z&V^{K4G{TMa<1G9Z-?te(UC?&GWZ!Ta)bV z_E`_~jN8Rx*RSW#g=OgwG{jbbWb2!)S#aPTE%W;~A#$S-RB0W)m-l{HrtOfr7aLP>MZ)DB3i!lf0ifpAp)`5qcpv%OUAiLCok&i-*p905InF%=~@Id&`Kc%V_ z4{;$v;R2YQCs&vO0#8n$dR5d3JrV?(APw1uU6U*5o};hMli257nB1$E{MQbiy>BCQ zeXt3y)8MkI-a~gAc8D_WdMvd9t|`7)d6E50hAkAVp!sU(7IUn z7`_k?x7$YInOm&8aEg)^#1?}RKTZqL`_7?bAsGqB(sAk(Tus*- zmh}+t^>p%9CMmashX%OU;-zXc+xBNZl6)KxgE`7X#p|dNTjIAFti8M9&g$TiV@i(| zrdw}fZOGd0ISG2N&rP7;L@_@Sx^o^+uUgg_7Y`hLMy?jzppXtj7X#FKpfn8hjVu5t zBt~XNhtJIfi*us~bDk)%CfJUuFmAO_NVVM#_!uxwvCppP*snZ??m z4u~sxZLD{keeJZveb^BJm^hEbC2Cx%&tqFQ_M+X_1_Xk01QHM8yxl$1(_(J4B`2UC zhD$ADFV1ojg~;jxTAVgvFfR!+JJFPjRmoYZ+3dGN?V0*O^xzMgg38X|${?9Lnh(`V zVCQlTI%c7W_cw>T65j<3R&KX5mJuYJlvNh=&q;CLRtm1OJhh@?S&8t)YmtxSAvj6M zBDm(dMrsM%R;GhC0Ijl1_hKL?5@T{CN++QhF;*v0>VDtmVaf3Oeat`Hlyu#XNk)>v zb&nTw%30lkG6~X2_$teV=)O`15&o1NYUrd}P{J*kKw;Vo0OKV?p?v8e1E^$Z@8W_* zo1}=7Ju+s}P)oJCwF^>|ND+v8#zlZ0YNkAg`-}a+yUp%T8OKP&inLGNyBu!I5Bz#8 z+V95fk6LBJ)JT2JHcN>c}|N|j?*$J?x8K|Tweu97cpT8N9dEs&?= zvZ-*=`l?%_sL+<@HWCu`6KrD>P^v5}Z{-p@kCDVG zi*2_1?nD_DmSkb_L?7-sA>1`#)F6R=;kQ1}NRO&M1zi$$TkB>YY#k)K0)igyTI5AD zEk!EDF8nuiB;e5bpw9Af>?~>)qcx8kd%M1B-p&V1ugpVMKpaoNE|NKS);(`!x3jj} zTCuePHX#uUZG!;1ymc}%5hT0Ks^wHH1i|fKF(!a~kQ^THA_1p$P#z|7z%cnBG-gL= zh#+8aK`I6(PO3J4qKcbn!ZE;P3koYfh8ot@m4p;42g z5=JJGIb-oaMj!~)n*v<}fuS^}NFGc{aNyxwFhIjdjV%*U!!!W69I++x7$6nNl0hVi zF+mn&IEbUwodD<5fcYMX0!#^W9a79HBi%u<5KXKfG<^VD5UHmXT$|?rn=vk;si-C7Q9PRVT zBdWz|d2fAg0i<4-bWk$)Bw`vdq0Fc&w>+=_h|gJU04iduZ}Qg&ZCZannqsOqTkDcC z6S!5x#U}FkktCB&g=#{mx5i|aks~KvBQ;BYQjCZ{HMT>I_?Xm^-!z7`{=np54(nt~ z7yGu{(Y~+6bdN96HNVwDU+T$;0l#Y7iQ@E~fuW@Xw7M3fAaJ;ArOY!iW>HUs+{QX< zFG-OOLLktTa1TRK`&CLbXA&bglcqIsQSd5{KK|l+?A?jsIJ=Jn{{Y;-6Nw){{ZzHv zjz6{sOGUiaUV$yjfB+Z@J}8MhdsDeKIO0}n#*2>I7N86lJ6n;W*}z61`h3hip>~Kr>VMHdrHH}KWl$N;Q6Phc0qWjrvXNtynU0Cqp+B_+md}@r zB@ptj)M}V7E$>93P{$D<=mogkN?pv-6(O-5P(haXTe};uHF}4|1nKUfe#n?Ca6tn5 z7#Pd7fjwNH&GHfkU=x7FYB5lKqqL3Bb8a^hsM}ipTZbB^bpAzl;ph8S_Sx=c2124B z7WuA^H5L*QkumPmi_)hc0a_=e*nrlhQ&(Z=%>jXsX7v;X`g^5-#Ej4uEFv(F^6G+3 ziN{k%x77sp zaT1WzLe(cE0|e;qAfAH~-fDr|XA&fgi!ebR_L&-&0)Y`4@oErA6!2uLReszryS&4* z?n=1^E6v;8$E5ySaxLn4QZCH18+q?1xHmWMWWn=W#9HjPL+v+%MkDiBv13KYZe~Nw znRJT9X>51;dqqwpDOwKg``1A-mY9r!h=+FPZl8c6h^UvLCN6NtugwiY+(0=F8#i}U z)mG}+5+oc(D^V3YxX^}RwGyefaHoz-QI%!Grb4)6w93=loAb8jHrE^oNd39_Noq0N z*z{k!8C=ybRxV45U{^Hcdfk#7xBBfuZrfZ{|&^$Lm#lwB6x z@B_7TqL`sswbHm#Q+4HvpWn^FR^2ovAh>q0LcgvgM@)luLo?wsJlRg38w= z3ymn^)rtJV2%G!*VJSPHFA={Ix1wd?__`u?=3rYO$&Mg0Lb7}7pk0|bGSsZp-((1j zd+Wuu&g?`_gk$?xZXQpy^3}wV9Zm~j7AtNeTe;f#XF?Db*`adASO6-3&@m@T$FGtD zMo=MuEbf5tpL51KTfqUW)=il%ehLZD)CeFxk%;j{7BdV^LY3+fT^o@knEH>+5txm` z0a`{(h+R{o4Ms$K7@&M6NbL-Be7uk=(49;&2s%zB7a+5@f}k>-JtVOe1puWm*)uW$ znFj_Z98?3GjLfvf%>!nDF(r;wU=B1?3hRTZ$tH$4pp7{R4KpqLCohVW#BIdHAuV2j z38Ae6)hX_(cnL<<+IKM4Wik#O#n+ps(c*Yk^L)6J^a3g>$D**Tmg@1jxC7?2%FAJV zec=)Gvz4BfH2XclG1C&%#dEE!Y}^qPW|l6XIJih}nu-n5$3NVH9r?+f=vx5hiGn50 z_r{rZ`Jjh-5n?e14+TYT=GY*XrcL0r5lgzZtQ>a_DwqkIrSaUqDH{9TceA$!BPVN`-#ZWg42Ro@2j@>;}V zJ>l;|DBRr@L_R$k2M{7( zS8i3JF1k~Yaw#?*yIhf zrcPn_rBSz=fjdTGev#UI(g^$)AP(r-G$#R?STsAW;kRc&E>G2(LbH60(0<`KVCu#? z^t|>}x8Wl&0F}$P36ZS?h+X-3{=V8kKm<2JAdzlCfebz$f(c{p0qbbvg;d2lGBO}IV_Yh7NTd2j zHNn|Ym(=jn)KSHJRAtAuLaf1@c%XPMARH1Y@>C?Q6CgCx3=lI|(o1JnKq+aYplH=3 zAQ_M@!OkFHfN~^Ay#O9+0hvliu!z>O=nyhtqT{)-Il2JMxdbqlV3s9NIXRA#9C0V2 zf|uMIv9#lFNRbmZwQg7vPwrEy-_Cht_deveZ*Df$8vzp~#~$s)G`D)?JC_Up01B+? zyzU<9k|N8Dzu&0(e>E#h?Y{UK20CH*y60m{ZMN<#9MIv_OjNkkowDb0{jpM2HKUWH{ksZd1fJ9PG?_cs-!It-5xo!bI zJ7qQ=oyFMa{(<_e+Uv&}$1@imtldXh1hyVQ@f zJvETSHJe+JbG6$UlSTnyq@im}To$fKqQ^^8HU2KXY6nVW(VH^JILy(*WP_$atw4{4 zC;=X)zsoD}pqxN)BL2Wl$+@L6Z}vMNk`;C5bLEMo+c7B2M-F5H90; zJrph*1LCY*LfUU-9n5AV(tLas#As#8n~{WF!HIL^vm&eayP|9!k3y_xtKqNqbmBM- ztb-3!rHx$XyT^;^?R#oQZ=?epqVzestR+AK`n^M-Kzn4yBtESE2nhfjNt!=5KzM)v zB(lPAPva~R7u=ad7xyq8elR$UI+#E z38Mq6tBT;DNn9XM*Ec}fN>Ko~(qHC!gbX576mT-5ssQ%HnAD721P)t&V_~(qz1>em zi$UmWPCyQ-Rpx8Rx!-Ye9M1Re-kFBpCARhfppRcQi(Z~M#2@M*2M*=(#bMCd?rz+q zMHK|GvfW%RLj-Re%kq0^TbVf571CEa)O&X9zv3(bAPA0sBxx~1P6x?plumP( zmcx&ci$`&Pvet6(KLo49+QqkSqDhpVQYR8lYZ~;)fEtxS?Fu#sqgjEub50;)vNYUo z+e`&0vs#Ob7FaV90I$Vjw-c<}(lI(tU!sa3A(}Bdd{hLCr2rT^*RSS*z~BiDD)lHE z7jQswPAI04a80z6i#h!eq297ca&(N55bxTYMIJ&~svzB*trjlXtwunV@gd@>2OYtI z#pBTf<1lLzTu}_Yc2bI>x_68&hQQ_1#Z*h%auU`7ljQzshKae{iCNPU>{N$do`vjt z;^($@@@M;IJXh1`mn?fhjSS0mL9ZkYNxb8dDq)9weUP2m-PPt~5n2+%q&iqXAU|%y159RT-#U ziN-Ej->B%K97_#A2><~e41u>L7K?^~Ia0p_0yl<`4|5!-fs(pnHAp;Ns4(+DKe-ZE zOgX@u)eI+4kObER3m_vB!nt+$s2OuyNG7d`{7^84lf)SkDiF|Q1NvX9{)vaTn16A( z$nNCjBcq&x6^=Z)*VxJTy@K`6vWh~wTr#C5o+B? z@mW#sLfivK9DqYc+uXHa34LM?XY85oCxq$31;=nGSvyQV;_o9Z?oovz>Vq`HB%L73ER6C1@T~@uin@= z8i9f6kY~61U>pMeL23-|CA2e)zcRW?#fR}%zTVCdXV6HH7=_YTo9PzTuLB}A>7e!G zJ_}4^CCu_t-*OTnPiDtuztpK~uM@x$m@w$F>JVa4AmPcU$pyz1vY9SJ99d@8fiZ&L)EeQPA86XK4h))6V1&Tro(xi+G7e$IVnndBlSsr{JiSZ*&MR(x9dz zVeAiaSlZm58M&CZYV?Gx+>u};af;V9$Lq$u7BYqo&3Jtw%ju6ak&X8iL;%vIZM~GlD?+g%Bs) zjEEqRYJgJvM7ukj>4F4|q{JG6XnG*+LNH-Uj_mP3%}i)a^nce5;QMCguYW|90+u4cS0_3M}KPUOqVxA1W4AZ2 z{{W;Fn_7{t<8}Z5YPs6!BJ*!xL}Krf!%2|a$h!go6faaA{V);*wG7^f6xbRyU~psR zfkl!_0DcItQD(8Dy$XsoyJdxRH83I*jy&K ztD&;v?f~IkOb%A(6ITt7UxFCcdq>|l_7`EYVWYvEX0p01O^NM4ASe00>s1u<)U#uNDc#lNpsvx?u=$h=8AnMFA@PtXI0hKd^<)Ur4$Z09XYoME zPExl(2q(Do@l<)2_dlME-Oa8d%(X(pT-?k3WKtu^V%L9{EH#J|A=K2YyDxSY^u$Qw z*dnd$#^Y)y&1Fp7T?80|+xnqL*lZ_uP65&m1!mQetK&Gz4$@9c7AS7h!5+KG=)Fpve zOh%r}7mPy@nj#h5u{4m!Jb+r25oPx*&N@p-jZrS(fz?qvZ@h)r7)qE>_^gPV{izH_ z4~np6`73&{#9&uWT>6Z!GrPHabR!|AHsSySu4Q$V%MiZd0Tk<34yQq7v;>iv$f;H} z{0_tjM3Il`xpiH6jaJidEfEaFhklEjYl|CDV}&w7GS<`+sk|^zPdjLXrLe31iJ_CQ z;A&<$W||utMm4A%JP0SqNUk3fP%CHDrX5vL7D zA`libi3bK5pe$r{Y6XB4J}3wzLjq_p9a#gVAt1(t5Ko0rIphy%a#^zYpw39?A}}H3 zK3^38B`KSZ3x;F@`-Vk>J0DhG5`aTlF2upuh@f3nF)`Eua)AuUhyWPJC$Gr|8R{Y= zRxzb(Ulbf<7y?|J$Yc#SOhztz5JTm+_PG8#amZb)Z9tG7gp2_3bk*nE!S{Q++s)PO z)#6S2^EV_;HCeA$J_Xu98IM23Wu^Ac*#r~vQBvo9o&yZZi>W+!A3ep_V%Rr=maL7Z z6T!Zdr%!_A)pe1q*zsZ{c8=b-tSZtQ7>}dP0inmh%UGb!D&R?Rp~KX4@E9g0qwYAU zNI3NVI3cQ?-xv>Y#n{s(OjRcDkIzm-`6w%8Y=?_i_?xP+1D%-qp^0oU@>fNE_m3nK zrH4+6>M8D9xoUca04^00VRkpI7~HI~RTNyF+y~R*!!@RB6V2NoYa_ZPitEdlN_}sd z+ap*c$R&!=@q1Hp+`hSPunSyHO^Tu^Bi5{dejwJ}k;*qdPXgC4H8E1inzMBBOA zY0*?k`+z{v!O0p@a&Q`n#AK{yo$Wq)=LyZ(-Gls+L@$oEkqNL2CI0|Tf5`zLBs+&_G$8)O1%NF{JSZHD&L|BTFqS_6=j4Gz zj*>+xNN{tmC>^K@mL&DhBm~t41hFj40Qn%xU7XqBAsood;Gh}1sln0+YP%pD<0Aqc z+avlQVYw0u$cW(_ybvH0^gHyE)dQTyA;@egM8Km+i7sWQp{aDh*qP3<3<2#U_n=A0 zHk?}!G5io>Ke{}P%N#b}W*Rcx+<5`~7Q_B*rF7yv#@HmV6bd~HU5?q0jw>}{`PH?4JTINm5kMWg%HadmOG+D0Ha@GX+K znwU1R6o@VSNrs6Hpkt4MxSD+S*cSMN!5-$+vk^|AL0`GrYIB$c&Pk0$Cg*1sAXFMG zs)u{C5RRv#m-s3x#hQk!ja>t8TN4DtcVbXd@AiEKWs0(;Q(b#9aYKO%Y@=_4XANId z7gi-?Ijc_zxWpCLmoAwdMcXjCIi_r@ay~dIT8;kzxA^kWBzBf7msQu8+wuEDkicTO z*GRar0T~DNVe(ngV{1{T@f8{wp$bS;AmI&1Pt}R?LD8`%?ZEs{PKMgtVkAXzr-}l7 zsFp3->_8|UL_+`ou3Z&FG{uaAftxZRrZK6~bw{t25DxBv7Zhv=MMAqHAZSBYpQ?&& zy}7tG2>OFj&`Gzkk&yyDtxS{;j}ZA9(-k#Mxy2aC!65WkL`%F$I-UF-O+_yIi2#z% zk)qtGV>QTea*3eB!E~KD-c@pptjGxpX130&_tDi7kW=1)=(QQgvwv(k(aHOM8(Wgq zy4WAJD4b2RSe3Z){U?^nGL^cRf(| z%hw@h*_6qMh$cq>M^loE9y{+Yc=J5Wr*HoNt6+V*1Hc-eip#$o;H=8a8YGZ@2m>b zrVACQq2Fzfc9TSDLv{k)z~O`BfKnnQzzu;x4|Ql<1ax|ysto@CC$~B^3brexOjX;F zV+j)=-D*i$3hNxI^VtRS?&1nVg{TJD4Lc302~W>Wz{h?$Bws)R|ZoTQ1={cB;W!Y zs)nlfyfkGAG)w+ytj8(CmXOd}_?D$h8IAt{5g-VVrbU+LOx{_|?#kprAH#rMWpk=4 z)`%ow)D=;4?0$A!C%7%nQZd@@TFvp05+SAVEVV0_e7(<9NELTt4^VSkk2j&jqFBmZ zu{geE0by`U3b%p>M&#lI1S6eZh!zvKGQ+&)VVA_9djJlcMgTCc>VeT<1m;>mVp-~g zDg4ng^CUAie>4sIfJm{@2+z#`-r?>NCrPeDN(2&-BTJY|0)vERH86=I>IT1x1q6*o zM^{#AekeFfFGnNbP%vE~!FD2pACiS(zqo$m`!>%LwwLoJHSXs15&B{A%}ZT)<$|$j z$kceZMV)t%Z?v!j1BXQwZVYW&G7(}00*bu$zZ7S1O!~bCAe65yslL7|6#8 zzlzIkHrB*@Luvg}5oc<|L`w!`ahp=DZR3!Bs^dB^vrHIdt|pXQ(h9g~4YxJvf|zJ# z1)C7<_$a9NATyz^3o8{H+kMAS?V~K#<2}EKs1yn`&+gy^iJ`3>1TZ3KSeL;7?!lyc za&`&|eoDYPkJ8vT>{^32e#hIKzF4iYqvq{BlOl3mIdkdfoBD4qd58TMSmR!$>^=x> zc=%qqALiT|<5BcI0t4B+SjfxfKO_%%PZHq#!U=ZdK&3#>GzlxBG&LBRAZ3|}N}~ae zNDriCQhrQ;7q7AVc*_>>Ky9AS?n_V%*eZ=4%V0!Cpye@}R#x`I2B7G!CZ8KRLxDnA z6v4*J%D+mOXjgXemzZ}`7f^5QNspF6MON;(*h(Z3QV9-=tmh}e2}R6kJw9ow$a0)9 zc~i}Ao|(L|Jf9P$MvPz7y2|Hbg7uRUV=+-f(D^MfW7$8qzTiBs2X4jE4(nzGtMWO4 z=$FJ%bmqL@PFko*$P^-^7N>%)XA8F2l4K7^;Y0<5fC5CfLPZJ(FeUU2c?>>mfP@1^ z24f&-fkebWGtVF4e~JvGr6A5t0djzMX7XZ5iKJPv$<(2-)EV%0{miICDT2<%t~w5= z5y@f*G8v!TqMH*Z22g1?T=GOZQ;TVLz!2ZD1$R5jTjIFO+quo<5Z2-Tv*~Y&HOzS3 z>-V?2x!=5X+_@tu$mUP%Sg%JstTtPHR|ik1sM_;uv;cquo~mkzbba03yAi>`lXxjr z=|0!vqXP`>vNd_;t}~|_ zMEHQN8sh@kd=vw@5FaMMqJ#i4si4VbuA^VKi)WT>vsP7R?hP7-dT4zRv{2FVIF`{dF^^6Ool8J zSyL@qB091D6snbNqGILdYM^}Qi~c@&AZ%qIOHeWf8=9u)2;-6omgf@~xx)eZAd|O? z4N@;$JWv)_OiTJsBoqu1)JP)?@~u!3-Mukt2%L~NbGo%|1U*hIi=bx0-0xh}&R^87 zBT>g};}+G4$s;v+V$@3jDi+zJ{kJUP#z6zLR|+6WTW0{Nh-rp2_^6=D$dRTcF?AmP z-?K>p`l*Ymt^UGNiP9K!S;nPjH~cs;o~ZW`(MFj5V~09R#F7t8mgh`Z#PZx@I}a%{ zF4DQ!7qoe~@SNSNmn37hynfc?3^bF8@++q`$LY?!xXLn!E)A)GM1jN_hGn;uOLEdl zi4hr9+u+C?2rW~mB6Du23ju6Gl4m&=bPfavkUy4k0;K#) ziF)N!4HJ%l7>N%_AwZG3TTmtdoMn&6kSLoLn0U)GPl}-o$n=4yA~Og>B_arstVqBR zis2y;#E|_lLFV7weqvjWLf;!~{{Sy;HBGab%M+CrYp>2T+a0+eKgZ&;uFVd^Xc$s~ zO482h7HzW%j8p>PVlVO%k@S)SseLamT=wmtEx-ooI<8gLHrqP@F>0$4)t=rJ9R@2* z+M8?#9af_iCL*g$h$8r8m>VEoidX?C5<<#_Fhc;csJC?qQ#W-Qiv83>v13YktXATO zb!gU)(PgNj-C8Z&3sj=2CvD}01|I}d1+y5Khxm9Pjl7Pik_U|yMthOB*^h7q)}mHh zn$j&8pA0Ixa>r_qVe#?3&2Bf64kC0%$R6*}Z@b}+Bh@0qKJ0*8BefnD*`tJxASEF2 zl#K)Ej$SG#u#s};3T_7k`~n4>fB^Lb6bylRR)&PCCR!hG#5ZXTsQ4%(feUdADhLnb zk`6KwkYhsl{wN6+i~uwT=jMPn_c1-7P~+7D1VrCVON=CXE27(sv;d4o0;r8P#@Jv; zCb)D}nzXdoHaV>_kZtz$L^uxG50arJ7ID=~4U|wc+iVM#qL^q?+v;*?dL}NTPQ%dr z6j@cMpPx=M@(qf(hui%}W?QUt(>}MZ5~_D~*pt{@U~Z z0P-AP{B`*mZuTLg8Vy$7gp<*AmF4+kuO#uiJ za)}N}lyE&hSfEWHmyIQnW*;X&HvT3u6&in3T?>7?x3$<`+{pg`F4PRniK_wRit&%R zb9cSDxVhasl9c2}iCB6$i_SM}^&!CgR%@e0wA&cNQKQr%qw*IRNXsl4M0d20{>eRL zv)87%_V#aW!Q&G~#w(kvX}6FO2NkI1pSL2NO0g<+v5g(^T8s}L!>ZCA_56_uAl^wp zWbxu7tR%A7Xu0eBcHr*fifGmwVI+=wO1-B_`U|*>~dp4sk z`BVh~HyU3^z~DSO6auvw7c!xd?SBlFMBTYPzb5E{Ykw`VVN#%FvEKgxfz42)nM{la zOu__)-SVa~Dg)Ws+_@;%v=ml@VY7?}rN~v9ys>XipDYz-rdkK8)MXhSkHzHJoZN-s0n!8G+_J z5vQGVn;>o6_@5Qqn&s4HcwSon01M4o-r6*TglCNNdyXj z0K`||gBEKeFj#>?EAw;?jphJM7Br8D>VXZ=z`v8V2gMcI;=!cA=F~$CoTMZ)$%9wL zC~Ts{F%;_cbV|&BaChf#!VS2SPjw+3Blu%d%4??+SbjTfXmF-0FGOj0-LV>RS**u6 z*(Wuq!bYaWRKuf&6ht9nKQNX7P9SGRn$Qvkqs2u6Q6^LvbXl>WE<~MFp;1+vs0xNS ztX86ve+Y?GGk!}osHNR{q|6@zkyW>K5sR~jR72dvn1{)oK3 z+q6IVZU~Ch=Ly@TH%p|T3d1>xue@~B9Q7>!=Ad=6QMG-CJ362G-JP;P$l0{7; zQzOwePmCO#{t2R8y|Y9N4gh$dowM6iHfW2@wU9Eeg0U0rTQqz;7O|R(qzFD#7T&rq3!CseW@o2b-MZuJ5{6fC5TYO+?zp?VWVaMWAQYf#`g@l@4T`k}C4-6S4&?g$&4 z*22LK(v`wIsrs(*%C*}&a*QHGXhSSkqT0k;Oo%K44>~BL-FZ}kCHc_<#3v&V#fC^H z*?|Sk9jI!iDD#6iPr$Nap&Lv!mw&31RM25=Q<=oY`e%wF$8Wc|WEc?m6Z)tuZS7+l zPa^Uec_st^(j*fTm2*WF*pMPE=kribvut KPwX^BfB)II2+2bL literal 0 HcmV?d00001 diff --git a/bin/windows/neko/bin/glframework.exe b/bin/windows/neko/bin/glframework.exe index d498cde2287f909a03bd93ff2a746f835c8a4dbb..26a6e2c58072bd4ed281f5f048308458ddded296 100755 GIT binary patch delta 119217 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 diff --git a/bin/windows/neko/bin/manifest b/bin/windows/neko/bin/manifest index 241353f..8fe5088 100755 --- a/bin/windows/neko/bin/manifest +++ b/bin/windows/neko/bin/manifest @@ -1 +1 @@ -acy16:openfl.AssetDatay4:pathy19:assets%2Fdesert.tmxy4:typewy16:openfl.AssetTypey6:BINARY:0y2:idR2gcR0R1y19:assets%2Fhxlogo.pngR3wR4y5:IMAGE:0R6R7gcR0R1y16:assets%2Fmap.tmxR3wR4R5:0R6R9gcR0R1y19:assets%2Fmapxml.tmxR3wR4R5:0R6R10gcR0R1y19:assets%2Fplayer.pngR3wR4R8:0R6R11gcR0R1y18:assets%2Fscrol.tmxR3wR4R5:0R6R12gcR0R1y19:assets%2Fsewers.tmxR3wR4R5:0R6R13gcR0R1y26:assets%2Fsewer_tileset.pngR3wR4R8:0R6R14gcR0R1y20:assets%2Fsprites.pngR3wR4R8:0R6R15gcR0R1y20:assets%2Ftexture.pngR3wR4R8:0R6R16gcR0R1y20:assets%2FTileMap.tmxR3wR4R5:0R6R17gcR0R1y18:assets%2Ftiles.pngR3wR4R8:0R6R18gcR0R1y31:assets%2Ftmw_desert_spacing.pngR3wR4R8:0R6R19gcR0R1y19:assets%2Fzazaka.pngR3wR4R8:0R6R20gh \ No newline at end of file +acy16:openfl.AssetDatay4:pathy19:assets%2Fdesert.tmxy4:typewy16:openfl.AssetTypey6:BINARY:0y2:idR2gcR0R1y19:assets%2Fhxlogo.pngR3wR4y5:IMAGE:0R6R7gcR0R1y16:assets%2Fmap.tmxR3wR4R5:0R6R9gcR0R1y19:assets%2Fmapxml.tmxR3wR4R5:0R6R10gcR0R1y19:assets%2Fplayer.pngR3wR4R8:0R6R11gcR0R1y18:assets%2Fscrol.tmxR3wR4R5:0R6R12gcR0R1y19:assets%2Fsewers.tmxR3wR4R5:0R6R13gcR0R1y26:assets%2Fsewer_tileset.pngR3wR4R8:0R6R14gcR0R1y20:assets%2Fsprites.pngR3wR4R8:0R6R15gcR0R1y20:assets%2Ftexture.jpgR3wR4R8:0R6R16gcR0R1y20:assets%2Ftexture.pngR3wR4R8:0R6R17gcR0R1y20:assets%2FTileMap.tmxR3wR4R5:0R6R18gcR0R1y18:assets%2Ftiles.pngR3wR4R8:0R6R19gcR0R1y31:assets%2Ftmw_desert_spacing.pngR3wR4R8:0R6R20gcR0R1y19:assets%2Fzazaka.pngR3wR4R8:0R6R21gh \ No newline at end of file diff --git a/bin/windows/neko/bin/rescale.png b/bin/windows/neko/bin/rescale.png new file mode 100755 index 0000000000000000000000000000000000000000..e68196e337c36f33ab7dad7b995bda7eb31a0b7d GIT binary patch literal 30529 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হmyMSp(*>aSP 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 C5O1~s diff --git a/src/com/djoker/glteste/FPS.hx b/src/com/djoker/glteste/FPS.hx index c2d10a0..e3664e8 100755 --- a/src/com/djoker/glteste/FPS.hx +++ b/src/com/djoker/glteste/FPS.hx @@ -1,5 +1,6 @@ package ; + import flash.Lib; import flash.text.TextField; import flash.text.TextFormat; diff --git a/src/com/djoker/glteste/Main.hx b/src/com/djoker/glteste/Main.hx index ef127d6..a0efbc4 100755 --- a/src/com/djoker/glteste/Main.hx +++ b/src/com/djoker/glteste/Main.hx @@ -53,21 +53,21 @@ override function begin() // fixRatio(480, 320); - //this.setScreen(new TesteBatch()); //this.setScreen(new TesteAtlas()); -//this.setScreen(new TestneBatch()); //this.setScreen(new TesteCloud()); //this.setScreen(new TesteCloudTiles()); -//this.setScreen(new TesteBatchTiles()); +//this.setScreen(new TesteBlockTiles()); +//this.setScreen(new TesteBlockTilesCache()); //this.setScreen(new TesteTiles()); //this.setScreen(new TestePrimitives()); //this.setScreen(new TesteBitmap()); -//this.setScreen(new TesteDraTiles()); -this.setScreen(new TestTrasform()); +//this.setScreen(new TestTrasform()); +this.setScreen(new TesteTexRender()); + } diff --git a/src/com/djoker/glteste/TestTrasform.hx b/src/com/djoker/glteste/TestTrasform.hx index 134dd66..dcdcc41 100755 --- a/src/com/djoker/glteste/TestTrasform.hx +++ b/src/com/djoker/glteste/TestTrasform.hx @@ -21,13 +21,13 @@ class TestTrasform extends Screen var tex :Texture; var batch:SpriteBatch; - + var particles : Array; var child:Entity; var player:Entity; var logo:Entity; - + var caption:TextField; var playerTex :Texture; var skew:Float = 0; @@ -36,12 +36,11 @@ class TestTrasform extends Screen override public function show() { - playerTex = new Texture("assets/zazaka.png", true); batch = new SpriteBatch(500); - var caption:TextField = new TextField(); + caption = new TextField(); caption.x = game.gameWidth / 2-100; caption.y = 20; caption.width = 200; @@ -49,31 +48,49 @@ class TestTrasform extends Screen caption.text = "Test trasform sprites by parent "; caption.selectable = false; game.addChild(caption); + + tex = getTexture("assets/texture.png"); + particles = []; + for(i in 0...200) + addParticle(); - logo = new Entity(this.width / 2, this.height / 2, new Texture("assets/hxlogo.png", true)); + logo = new Entity(this.width / 2, this.height / 2, getTexture("assets/hxlogo.png", true)); logo.blendMode = BlendMode.SCREEN; - player = new Entity(300, 200, playerTex); - child = new Entity(0, 0, playerTex); + player = new Entity(300, 200, getTexture("assets/zazaka.png", true)); + child = new Entity(0, 0, getTexture("assets/zazaka.png", true)); child.blue = 0; player.add(child); + + + + + game.clarColor(0, 0, 0); } + + override public function update(dt:Float) + { - override public function render(dt:Float) + + caption.text = logo.getLocalToWorldMatrix().toString(); + + } + + override public function render() { - player.rotation += dt * 2.1; - child.rotation -= dt * 2.5; - player.skewX += dt * 0.1; + player.rotation += game.deltaTime * 2.1; + child.rotation -= game.deltaTime * 2.5; + player.skewX += game.deltaTime * 0.1; - skew += dt * 1; + skew +=game.deltaTime * 1; logo.skewX = Math.sin(skew)*1; logo.skewY = Math.cos(skew)*1; @@ -83,8 +100,15 @@ class TestTrasform extends Screen batch.drawEntity(logo); - batch.drawEntity(player); - batch.drawEntity(child); + batch.drawEntity(player,true); + + + for(p in particles) + { + p.move(game.deltaTime); + + batch.drawImage(p); + } batch.End(); @@ -96,6 +120,13 @@ class TestTrasform extends Screen +public function addParticle() +{ + var particle:Particle = new Particle(tex); + particle.Init(); + particle.blendMode = BlendMode.NORMAL; + particles.push(particle); +} override public function mouseDown(mousex:Float, mousey:Float) { diff --git a/src/com/djoker/glteste/TesteAtlas.hx b/src/com/djoker/glteste/TesteAtlas.hx index 44d43cd..f0ef82b 100755 --- a/src/com/djoker/glteste/TesteAtlas.hx +++ b/src/com/djoker/glteste/TesteAtlas.hx @@ -3,7 +3,6 @@ package com.djoker.glteste; import com.engine.game.Screen; import com.engine.render.SpriteAtlas; import com.engine.render.Texture; -import com.engine.render.OrthoCamera; import flash.events.Event; import flash.text.TextField; @@ -19,8 +18,7 @@ class TesteAtlas extends Screen var tex :Texture; var batch:SpriteAtlas; - var camera:OrthoCamera; - + var particles : Array; @@ -29,39 +27,37 @@ class TesteAtlas extends Screen override public function show() { - tex = new Texture("assets/texture.png"); - camera = new OrthoCamera(640,480); - batch = new SpriteAtlas(tex,camera,500); + tex =getTexture("assets/texture.png"); + + batch = new SpriteAtlas(tex,500); particles = []; for(i in 0...200) addParticle(); var caption:TextField = new TextField(); - caption.x = game.screnWidth / 2-100; + caption.x = game.screenWidth / 2-100; caption.y = 20; caption.width = 200; + caption.selectable = false; caption.defaultTextFormat = new TextFormat ("_sans", 12, 0xffff00); caption.text = " Test 200 sprites with SpriteAtlas"; game.addChild(caption); + game.clarColor(0, 0, 0); } - override public function render(dt:Float) + override public function render() { - camera.Update(); + batch.Begin(); for(p in particles) { - p.move(dt); + p.move(game.deltaTime); batch.drawImage(p); } batch.End(); } - override public function resize(width:Int, height:Int) - { - game.setViewPort(0, 0, width, height); - } - + diff --git a/src/com/djoker/glteste/TesteBatch.hx b/src/com/djoker/glteste/TesteBatch.hx index b84e76e..2f3c67e 100755 --- a/src/com/djoker/glteste/TesteBatch.hx +++ b/src/com/djoker/glteste/TesteBatch.hx @@ -33,15 +33,10 @@ class TesteBatch extends Screen override public function show() { + - tex = new Texture("assets/texture.png"); - playerTex = new Texture("assets/zazaka.png"); - - batch = new SpriteBatch(500); - particles = []; - for(i in 0...200) - addParticle(); - + batch = new SpriteBatch(1000); + var caption:TextField = new TextField(); caption.x = game.gameWidth / 2-100; @@ -52,45 +47,64 @@ class TesteBatch extends Screen caption.selectable = false; game.addChild(caption); - player = new Entity(300, 200, playerTex); - child = new Entity(0, 0, playerTex); + + + tex = getTexture("assets/texture.png"); + particles = []; + for(i in 0...200) + addParticle(); + + + player = new Entity(300, 200, getTexture("assets/zazaka.png")); + child = new Entity(0, 0, getTexture("assets/zazaka.png")); child.blue = 0; player.add(child); - logo= new Entity(this.width/2,this.height/2,new Texture("assets/hxlogo.png")); + logo= new Entity(this.width/2,this.height/2,getTexture("assets/hxlogo.png")); - game.clarColor(0, 0, 0); + + game.clarColor(0, 0, 0.4); - } - override public function render(dt:Float) + } + override public function update(dt:Float) { - player.rotation += dt * 2.1; - child.rotation -= dt * 2.5; + player.rotation += dt * 20.1; + child.rotation -= dt * 20.5; // player.skewX += dt * 0.1; - skew += dt * 1; + skew += dt * 10; logo.skewX = Math.sin(skew)*1; logo.skewY = Math.cos(skew)*1; + } + + override public function render() + { + + batch.Begin(); + + batch.drawEntity(logo); - + + + batch.drawEntity(player); + batch.drawEntity(child); + + for(p in particles) { - p.move(dt); + p.move(game.deltaTime); batch.drawImage(p); } - batch.drawEntity(player); - batch.drawEntity(child); - batch.End(); diff --git a/src/com/djoker/glteste/TesteBatchTiles.hx b/src/com/djoker/glteste/TesteBatchTiles.hx index 36241e5..be71982 100755 --- a/src/com/djoker/glteste/TesteBatchTiles.hx +++ b/src/com/djoker/glteste/TesteBatchTiles.hx @@ -1,6 +1,12 @@ package com.djoker.glteste; -import com.engine.render.Clip; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + + import flash.display.Bitmap; import flash.events.Event; import flash.text.TextField; @@ -8,16 +14,19 @@ import flash.text.TextFormat; import openfl.Assets; import flash.Lib; + import com.engine.game.Screen; import com.engine.game.Game; -import com.engine.render.SpriteBatch; +import com.engine.misc.Util; +import com.engine.render.Clip; +import com.engine.math.Vector2; import com.engine.render.BatchPrimitives; + +import com.engine.render.Block; +import com.engine.render.SpriteShader; +import com.engine.render.SpriteBatch; import com.engine.render.Texture; import com.engine.render.TileMap; -import com.engine.misc.Util; - -import com.engine.math.Vector2; -import com.engine.math.Vector3; @@ -29,36 +38,51 @@ class TesteBatchTiles extends Screen { - var batch:SpriteBatch; - var primitives:BatchPrimitives; + + var batch:BatchPrimitives; + + + var Toutch:Vector2 ; + var lastToutch:Vector2; + var toutch:Bool=false; + + + + + + var blocks:Array; + var shader:SpriteShader; var tilemap:TileMap; - var lastmouseX:Float; - var lastmouseY:Float; - var mouseX:Float; - var mouseY:Float; - var toutch:Bool; - var distx:Float; - var disty:Float; - var Toutch:Vector3 ; - var lastToutch:Vector3; - var position:Vector3; - var scroll:Int = 0; + + + + var segmentWidth:Int=5; + var segmentHeight:Int = 5; + var segmentCols:Int = 0; + var segmentRows:Int = 0; + var numSegments:Int = 0; override public function show() { - - primitives = new BatchPrimitives( 100); + + batch = new BatchPrimitives( 500); + + + Toutch = new Vector2(0, 0); + lastToutch = new Vector2(0, 0); + + //tilemap = new TileMap(Assets.getText ("assets/scrol.tmx")); //tilemap = new TileMap(Assets.getText ("assets/map.tmx")); tilemap = new TileMap(Assets.getText ("assets/sewers.tmx")); //tilemap = new TileMap(Assets.getText ("assets/desert.tmx")); - batch = new SpriteBatch( 3000); + // batch = new SpriteBatch( 1000); //trace( "map : w" + tilemap.widthInTiles + " h:" + tilemap.heightInTiles); - + /* var caption:TextField = new TextField(); caption.x = game.screenWidth / 2-100; caption.y = 20; @@ -67,18 +91,107 @@ class TesteBatchTiles extends Screen caption.text = "Test statics sprites "; game.addChild(caption); - Toutch = new Vector3(0, 0); - lastToutch = new Vector3(0, 0); +*/ + - position = new Vector3(0, 0, 0); - } + blocks = new Array(); + + var tilesetCols:Int = Math.floor(tilemap.image.width / tilemap.tileWidth); + var tilesetRows:Int = Math.floor(tilemap.image.height / tilemap.tileHeight); + + var viewWidthInTiles:Int = Std.int(game.gameWidth/ tilemap.tileWidth); + var viewHeightInTiles:Int = Std.int(game.gameHeight/ tilemap.tileHeight); + + var cols:Int = tilemap.widthInTiles; + var rows:Int = tilemap.heightInTiles; + + + segmentWidth = segmentWidth == -1 ? (cols < viewWidthInTiles * 2 ? cols : viewWidthInTiles) : segmentWidth; + segmentHeight = segmentHeight == -1 ? (rows < viewHeightInTiles * 2 ? rows : viewHeightInTiles) : segmentHeight; + segmentCols = Math.ceil(cols / segmentWidth); + segmentRows = Math.ceil(rows / segmentHeight); + + for (y in 0...segmentCols) + { + for (x in 0...segmentRows) + { + var sw:Int = x == segmentCols - 1 && cols % segmentWidth != 0 ? cols % segmentWidth : segmentWidth; + var sh:Int = y == segmentRows - 1 && rows % segmentHeight != 0 ? rows % segmentHeight : segmentHeight; + blocks.push(new Block(sw, sh)); + numSegments++; + } + } + + var uvWidth:Float = 1 / (tilemap.image.width / tilemap.tileHeight); + var uvHeight:Float = 1 / (tilemap.image.height / tilemap.tileWidth); + + + var tid:Int = 0; + var index:Int=0; + + for (y in 0...rows) + { + for (x in 0...cols) + { + + var segmentRow:Int = Std.int(y / segmentHeight); + var segmentCol:Int = Std.int(x / segmentWidth); + var segmentOffset:Int = segmentRow * segmentCols + segmentCol; + var segment:Block = blocks[segmentOffset]; + + tid = tilemap.getCell(x, y); + if (tid == 0) + { + continue; + } + tid -= 1; + + var tx:Int = x * tilemap.tileWidth; + var ty:Int = y * tilemap.tileHeight; + var u:Float = (tid % tilesetCols) * uvWidth; + var v:Float = Math.floor(tid / tilesetCols) * uvHeight; + + + + segment.addVertex(tx + Util.EPSILON, ty + Util.EPSILON, u, v); + segment.addVertex(tx + tilemap.tileWidth, ty + Util.EPSILON, u + uvWidth, v); + segment.addVertex(tx + Util.EPSILON, ty + tilemap.tileHeight, u, v + uvHeight); + segment.addVertex(tx + tilemap.tileWidth, ty + tilemap.tileHeight, u + uvWidth, v + uvHeight); + + segment.indices.push(segment.index + 0); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 3); + + + + segment.index += 4; + + } + } + + shader = new SpriteShader(); + + for (i in 0...blocks.length) + { + blocks[i].build(); + } + + + } + + + /* + public function renderMap(pointx:Float,pointy:Float) { @@ -134,76 +247,76 @@ class TesteBatchTiles extends Screen wy += stepy; } } - + */ override public function render(dt:Float) { - var tw:Int = tilemap.tileWidth; - var th:Int = tilemap.tileHeight; - - - batch.Begin(); - //draw_orthogonal(scroll, 0, 480,320, 20, 20); - renderMap(position.x, position.y); - //scroll++; -// renderTiles(0,0, scroll,5, 22,22); - -/* - for (y in 0...tilemap.heightInTiles) - { - for (x in 0...tilemap.widthInTiles) - { - - var id = tilemap.getCell(x, y); - if (id >= 1) + + + shader.Enable(); + shader.setTexture(tilemap.image); + shader.setMatrix(); + + + var vWidth:Int = game.screenWidth; + var vHeight:Int = game.screenHeight; + var x:Float = 0; + var y:Float = 0; + + + var minXSegment:Int = Math.floor((0 ) / tilemap.tileWidth / segmentWidth); + var maxXSegment:Int = Math.floor((0 + vWidth ) / tilemap.tileWidth / segmentWidth); + var minYSegment:Int = Math.floor((0 ) / tilemap.tileHeight / segmentHeight); + var maxYSegment:Int = Math.floor((0 + vHeight) / tilemap.tileHeight / segmentHeight); + for ( sx in minXSegment...maxXSegment) + { + for (sy in minYSegment...maxYSegment) { - //id = 2; - var t:Clip = tilemap.getClip(id - 1); - //var t:Clip = tilemap.getClipNum(id - 1); - + var si:Int = sy * segmentCols + sx; + if (si < 0 || si >= blocks.length) { + continue; + } + blocks[si].render(); - var DrawX:Int =Std.int(position.x+ (x * tw)); - var DrawY:Int =Std.int(position.y+ (y * th)); - - var dst:Clip = new Clip(DrawX, DrawY, tw, th); - - // batch.RenderTile(tilemap.image,x*tw-0.5,y*th-0.5,tw,th,t, false, true,0); - batch.Blt(tilemap.image, dst,t, false, true, 0); - //batch.RenderClip(tilemap.image, x*tw,y*th, t, false, true, 0); } } - } - */ + + + + + shader.Disable(); + - batch.End(); - + - primitives.begin(); + batch.begin(); - primitives.line(lastToutch.x, lastToutch.y, Toutch.x, Toutch.y, 1, 0, 0); - -; - primitives.end; + batch.line(10, 10, 100, 100, 1, 0, 1); + batch.rect(100, 100, 90, 120, 1, 1, 1); + batch.circle(100, 100, 12, 8, 1, 1, 1, 1); + batch.ellipse(300, 90, 55, 15, 8, 1, 1, 1, 1); + + batch.fillrect(200, 200, 50, 50, 1, 0, 0, 1); + batch.fillrect(280, 200, 50, 50, 0, 1, 1, 1); + batch.fillcircle(200, 100, 8, 18, 1, 0, 1, 1); + batch.fillellipse(300, 100, 55, 15, 8, 0, 1, 1, 1); + batch.line(lastToutch.x, lastToutch.y, Toutch.x, Toutch.y, 1, 0, 0); + + batch.end(); + } - override public function keyDown(key:Int) - { - if (key == 65) scroll--; - if (key == 68) scroll++; - - } override public function mouseDown(mousex:Float, mousey:Float) { toutch = true; lastToutch.x = mousex; lastToutch.y = mousey; - //lastToutch=camera.unproject(lastToutch); - + } override public function mouseMove(mousex:Float, mousey:Float) @@ -214,15 +327,13 @@ class TesteBatchTiles extends Screen Toutch.x = mousex; Toutch.y = mousey; - // Toutch=camera.unproject(Toutch); - var dir:Vector3 = Vector3.Sub(Toutch, lastToutch); + var dir:Vector2 = Vector2.Sub(Toutch, lastToutch); dir.normalize(); - - //camera.position = Vector3.Add(camera.position, dir); - position.x += (dir.x * game.deltaTime*1000); - position.y += (dir.y * game.deltaTime*1000); + + batch.position.x += (dir.x * game.deltaTime*100); + batch.position.y += (dir.y * game.deltaTime*100); } } @@ -230,6 +341,9 @@ class TesteBatchTiles extends Screen { toutch = false; } + + + } \ No newline at end of file diff --git a/src/com/djoker/glteste/TesteBitmap.hx b/src/com/djoker/glteste/TesteBitmap.hx index c8da58f..ef071e6 100755 --- a/src/com/djoker/glteste/TesteBitmap.hx +++ b/src/com/djoker/glteste/TesteBitmap.hx @@ -39,11 +39,11 @@ public function addParticle() addParticle(); } - override public function render(dt:Float) + override public function render() { for(p in particles) { - p.move(dt); + p.move(1); } } diff --git a/src/com/djoker/glteste/TesteBlockTiles.hx b/src/com/djoker/glteste/TesteBlockTiles.hx new file mode 100755 index 0000000..f93e2e2 --- /dev/null +++ b/src/com/djoker/glteste/TesteBlockTiles.hx @@ -0,0 +1,219 @@ +package com.djoker.glteste; + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + + +import flash.display.Bitmap; +import flash.events.Event; +import flash.text.TextField; +import flash.text.TextFormat; + +import openfl.Assets; +import flash.Lib; + +import com.engine.game.Screen; +import com.engine.game.Game; +import com.engine.misc.Util; +import com.engine.render.Clip; +import com.engine.math.Vector2; +import com.engine.render.BatchPrimitives; + +import com.engine.render.Block; +import com.engine.render.SpriteShader; +import com.engine.render.SpriteBatch; +import com.engine.render.Texture; +import com.engine.render.TileMap; + + + +/** + * ... + * @author djoker + */ +class TesteBlockTiles extends Screen +{ + + + + var batch:BatchPrimitives; + + + var Toutch:Vector2 ; + var lastToutch:Vector2; + var toutch:Bool=false; + + + + var shader:SpriteShader; + var tilemap:TileMap; + + var caption:TextField; + + + + override public function show() + { + + + batch = new BatchPrimitives( 500); + + + Toutch = new Vector2(0, 0); + lastToutch = new Vector2(0, 0); + + + //tilemap = new TileMap(Assets.getText ("assets/scrol.tmx")); + //tilemap = new TileMap(Assets.getText ("assets/map.tmx")); + //tilemap = new TileMap(Assets.getText ("assets/sewers.tmx")); + //tilemap.buildSegments(10,10); + tilemap = new TileMap(Assets.getText ("assets/desert.tmx")); + + // batch = new SpriteBatch( 1000); + //trace( "map : w" + tilemap.widthInTiles + " h:" + tilemap.heightInTiles); + + + + caption = new TextField(); + caption.x = game.screenWidth / 2-100; + caption.y = 20; + caption.width = 200; + caption.defaultTextFormat = new TextFormat ("_sans", 12, 0xffff00); + caption.text = "Test statics sprites "; + game.addChild(caption); + + + + + + + + } + + + + + /* + + public function renderMap(pointx:Float,pointy:Float) + { + + + + var tw:Int = Math.ceil(tilemap.tileWidth), th:Int = Math.ceil(tilemap.tileHeight); + + + + // determine start and end tiles to draw (optimization) + var startx = Math.floor( -pointx / tw ), + starty = Math.floor( -pointy / th ), + destx = startx + 1 + Math.ceil(Game.viewWidth / tw ), + desty = starty + 1 + Math.ceil(Game.viewHeight / th ); + + // nothing will render if we're completely off screen + if (startx > tilemap.widthInTiles || starty > tilemap.heightInTiles || destx < 0 || desty < 0) + return; + + // clamp values to boundaries + if (startx < 0) startx = 0; + if (destx > tilemap.widthInTiles) destx = tilemap.widthInTiles; + if (starty < 0) starty = 0; + if (desty > tilemap.heightInTiles) desty = tilemap.heightInTiles; + + var wx:Float, sx:Float = (pointx + startx * tw ) , + wy:Float = (pointy + starty * th ) , + stepx:Float = tw , + stepy:Float = th , + tile:Int = 0; + + // adjust scale to fill gaps + var scx = Math.ceil(stepx) / tilemap.tileWidth; + var scy = Math.ceil(stepy) / tilemap.tileHeight; + + for (y in starty...desty) + { + wx = sx; + for (x in startx...destx) + { + + var id = tilemap.getCell(x%tilemap.widthInTiles, y%tilemap.heightInTiles); + if (id >= 1) + { + var t:Clip = tilemap.getClip(id - 1); + + + batch.RenderTile(tilemap.image,Math.round(wx),Math.round(wy), tilemap.tileWidth*scx,tilemap.tileHeight*scy, t, false, true, 0); + //batch.RenderTileScale(tilemap.image,Math.round(wx),Math.round(wy),tilemap.tileWidth,tilemap.tileHeight, scx, scy, t, false, true, 0); + } + wx += stepx; + } + wy += stepy; + } + } + */ + override public function render() + { + + //tilemap.renderSegments(game.gameWidth, game.gameHeight); + + + tilemap.render(); + + + + + batch.begin(); + + + batch.line(10, 10, 100, 100, 1, 0, 1); + batch.rect(100, 100, 90, 120, 1, 1, 1); + batch.circle(100, 100, 12, 8, 1, 1, 1, 1); + batch.ellipse(300, 90, 55, 15, 8, 1, 1, 1, 1); + + batch.fillrect(200, 200, 50, 50, 1, 0, 0, 1); + batch.fillrect(280, 200, 50, 50, 0, 1, 1, 1); + batch.fillcircle(200, 100, 8, 18, 1, 0, 1, 1); + batch.fillellipse(300, 100, 55, 15, 8, 0, 1, 1, 1); + + batch.line(lastToutch.x, lastToutch.y, Toutch.x, Toutch.y, 1, 0, 0); + + batch.end(); + + + + } + + +override public function mouseDown(mousex:Float, mousey:Float) + { + toutch = true; + Toutch.x = mousex; + Toutch.y = mousey; + + + } + override public function mouseMove(mousex:Float, mousey:Float) + { + + if (toutch==true) + { + var dx = mousex - Toutch.x; + var dy = mousey - Toutch.y; + Game.camera.scrollX -= dx; + Game.camera.scrollY -= dy; + Toutch.x = mousex; + Toutch.y = mousey; + } + } + override public function mouseUp(mousex:Float, mousey:Float) + { + toutch = false; + } + + + + +} \ No newline at end of file diff --git a/src/com/djoker/glteste/TesteBlockTilesCache.hx b/src/com/djoker/glteste/TesteBlockTilesCache.hx new file mode 100755 index 0000000..03ab7a7 --- /dev/null +++ b/src/com/djoker/glteste/TesteBlockTilesCache.hx @@ -0,0 +1,196 @@ +package com.djoker.glteste; + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + + +import flash.display.Bitmap; +import flash.events.Event; +import flash.text.TextField; +import flash.text.TextFormat; + +import openfl.Assets; +import flash.Lib; + +import com.engine.game.Screen; +import com.engine.game.Game; +import com.engine.misc.Util; +import com.engine.render.Clip; +import com.engine.math.Vector2; +import com.engine.render.BatchPrimitives; + +import com.engine.render.Block; +import com.engine.render.SpriteShader; +import com.engine.render.SpriteBatch; +import com.engine.render.Texture; +import com.engine.render.TileMapCache; +import com.engine.input.Keys; + + + +/** + * ... + * @author djoker + */ +class TesteBlockTilesCache extends Screen +{ + + + + var batch:BatchPrimitives; + + + var Toutch:Vector2 ; + var lastToutch:Vector2; + var toutch:Bool=false; + + + + var shader:SpriteShader; + var tilemap:TileMapCache; + + var caption:TextField; + + + + override public function show() + { + + + batch = new BatchPrimitives( 500); + + + Toutch = new Vector2(0, 0); + lastToutch = new Vector2(0, 0); + + + //tilemap = new TileMap(Assets.getText ("assets/scrol.tmx")); + //tilemap = new TileMap(Assets.getText ("assets/map.tmx")); + tilemap = new TileMapCache(Assets.getText ("assets/sewers.tmx"), 10, 10); + + //tilemap.buildSegments(10,10); + //tilemap = new TileMapCache(Assets.getText ("assets/desert.tmx"),5,5); + + // batch = new SpriteBatch( 1000); + //trace( "map : w" + tilemap.widthInTiles + " h:" + tilemap.heightInTiles); + + + + caption = new TextField(); + caption.x = game.screenWidth / 2-100; + caption.y = 20; + caption.width = 200; + caption.selectable = false; + caption.defaultTextFormat = new TextFormat ("_sans", 12, 0xffff00); + caption.text = "Test statics sprites "; + game.addChild(caption); + + + + + + + + } + + + + + override public function render() + { + + + //tilemap.renderSegments(game.gameWidth, game.gameHeight); + + // tilemap.renderLayer(800,800,0); + tilemap.render(); + + + + + batch.begin(); + + + batch.line(10, 10, 100, 100, 1, 0, 1); + batch.rect(100, 100, 90, 120, 1, 1, 1); + batch.circle(100, 100, 12, 8, 1, 1, 1, 1); + batch.ellipse(300, 90, 55, 15, 8, 1, 1, 1, 1); + // batch.rect(5, 5, game.screenWidth - 5, game.screenHeight - 5, 1, 0, 0); + //batch.rect(5,5, game.gameWidth-5, game.gameHeight-5, 0, 1, 0); + + batch.fillrect(200, 200, 50, 50, 1, 0, 0, 1); + batch.fillrect(280, 200, 50, 50, 0, 1, 1, 1); + batch.fillcircle(200, 100, 8, 18, 1, 0, 1, 1); + batch.fillellipse(300, 100, 55, 15, 8, 0, 1, 1, 1); + + batch.line(lastToutch.x, lastToutch.y, Toutch.x, Toutch.y, 1, 0, 0); + + tilemap.renderAABB(batch); + + batch.end(); + + + caption.text = "Scrolx:" +Game.camera.scrollX + " Scroly:" + Game.camera.scrollY + "Blocks " +tilemap.layers[0].drawBlocks; + } + + + + +override public function mouseDown(mousex:Float, mousey:Float) + { + toutch = true; + Toutch.x = mousex; + Toutch.y = mousey; + + + } + override public function mouseMove(mousex:Float, mousey:Float) + { + + if (toutch==true) + { + var dx = mousex - Toutch.x; + var dy = mousey - Toutch.y; + tilemap.position.x += dx; + tilemap.position.y += dy; + Toutch.x = mousex; + Toutch.y = mousey; + } + } + override public function mouseUp(mousex:Float, mousey:Float) + { + toutch = false; + } + + override public function keyDown(key:Int) + { + //trace(key); + + if (key == Keys.A) + { + Game.camera.scrollX -= 100 * Game.dt; + } else + if (key == Keys.D) + { + Game.camera.scrollX += 100 * Game.dt; + } + + if (key == Keys.W) + { + Game.camera.scrollY -= 100 * Game.dt; + } else + if (key == Keys.S) + { + Game.camera.scrollY += 100 * Game.dt; + } + + } + + + + + +} \ No newline at end of file diff --git a/src/com/djoker/glteste/TesteCloud.hx b/src/com/djoker/glteste/TesteCloud.hx index f890461..022214b 100755 --- a/src/com/djoker/glteste/TesteCloud.hx +++ b/src/com/djoker/glteste/TesteCloud.hx @@ -24,15 +24,15 @@ class TesteCloud extends Screen var tex :Texture; var batch:SpriteCloud; - var tilemap:TileMap; + override public function show() { - tex = new Texture("assets/texture.png"); + tex = getTexture("assets/texture.png"); - batch = new SpriteCloud(tex,500); + batch = new SpriteCloud(tex,1000); for (i in 0...1000) { var particle:Particle = new Particle(tex); @@ -47,16 +47,18 @@ class TesteCloud extends Screen caption.x = Game.viewWidth / 2-100; caption.y = 20; caption.width = 200; + caption.selectable = false; caption.defaultTextFormat = new TextFormat ("_sans", 12, 0xffff00); caption.text = "Test 1000 statics sprites "; game.addChild(caption); - tilemap= new TileMap(Assets.getText ("assets/map.tmx")); + + game.clarColor(0, 0, 0.4); } - override public function render(dt:Float) + override public function render() { batch.render(); diff --git a/src/com/djoker/glteste/TesteCloudTiles.hx b/src/com/djoker/glteste/TesteCloudTiles.hx index be67e89..d90bcd1 100755 --- a/src/com/djoker/glteste/TesteCloudTiles.hx +++ b/src/com/djoker/glteste/TesteCloudTiles.hx @@ -68,13 +68,16 @@ class TesteCloudTiles extends Screen for (x in 0...tilemap.widthInTiles) { + for (i in 0...tilemap.layers.length) + { - var id = tilemap.getCell(x, y); + var id = tilemap.layers[i].getCell(x, y); if (id >= 1) { var t:Clip = tilemap.getClip(id - 1); batch.addTile(x*tw,y*th,tw,th,t, false, true); } + } } } @@ -88,7 +91,7 @@ class TesteCloudTiles extends Screen } - override public function render(dt:Float) + override public function render() { // lastToutch = Toutch; @@ -109,9 +112,8 @@ class TesteCloudTiles extends Screen override public function mouseDown(mousex:Float, mousey:Float) { toutch = true; - lastToutch.x = mousex; - lastToutch.y = mousey; - //lastToutch=camera.unproject(lastToutch); + Toutch.x = mousex; + Toutch.y = mousey; } @@ -120,19 +122,12 @@ class TesteCloudTiles extends Screen if (toutch==true) { - - Toutch.x = mousex; - Toutch.y = mousey; - // Toutch=camera.unproject(Toutch); - - - var dir:Vector3 = Vector3.Sub(Toutch, lastToutch); - dir.normalize(); - - //camera.position = Vector3.Add(camera.position, dir); - batch.position.x += (dir.x * game.deltaTime*1000); - batch.position.y += (dir.y * game.deltaTime*1000); - + var dx = mousex - Toutch.x; + var dy = mousey - Toutch.y; + batch.position.x += dx; + batch.position.y += dy; + Toutch.x = mousex; + Toutch.y = mousey; } } override public function mouseUp(mousex:Float, mousey:Float) diff --git a/src/com/djoker/glteste/TestePrimitives.hx b/src/com/djoker/glteste/TestePrimitives.hx index c64731e..04d3a2c 100755 --- a/src/com/djoker/glteste/TestePrimitives.hx +++ b/src/com/djoker/glteste/TestePrimitives.hx @@ -10,6 +10,10 @@ import flash.events.Event; import flash.text.TextField; import flash.text.TextFormat; +import com.engine.math.Vector2; +import com.engine.game.Game; + + /** * ... * @author djoker @@ -19,6 +23,14 @@ class TestePrimitives extends Screen var batch:BatchPrimitives; + var lastmouseX:Float; + var lastmouseY:Float; + var mouseX:Float; + var mouseY:Float; + var toutch:Bool; + var Toutch:Vector2 ; + var lastToutch:Vector2; + var position:Vector2; @@ -31,13 +43,16 @@ class TestePrimitives extends Screen batch = new BatchPrimitives( 500); - + Toutch = new Vector2(0, 0); + lastToutch = new Vector2(0, 0); + position = new Vector2(0, 0); + } - override public function render(dt:Float) + override public function render() { @@ -54,12 +69,46 @@ class TestePrimitives extends Screen batch.fillcircle(200, 100, 8, 18, 1, 0, 1, 1); batch.fillellipse(300, 100, 55, 15, 8, 0, 1, 1, 1); + batch.line(lastToutch.x, lastToutch.y, Toutch.x, Toutch.y, 1, 0, 0); batch.end(); } + override public function mouseDown(mousex:Float, mousey:Float) + { + toutch = true; + lastToutch.x = mousex; + lastToutch.y = mousey; + //lastToutch=camera.unproject(lastToutch); + + + } + override public function mouseMove(mousex:Float, mousey:Float) + { + + if (toutch==true) + { + + Toutch.x = mousex; + Toutch.y = mousey; + // Toutch=camera.unproject(Toutch); + + + var dir:Vector2 = Vector2.Sub(Toutch, lastToutch); + dir.normalize(); + + //camera.position = Vector3.Add(camera.position, dir); + batch.position.x += (dir.x * game.deltaTime*100); + batch.position.y += (dir.y * game.deltaTime*100); + + } + } + override public function mouseUp(mousex:Float, mousey:Float) + { + toutch = false; + } diff --git a/src/com/djoker/glteste/TesteTexRender.hx b/src/com/djoker/glteste/TesteTexRender.hx new file mode 100755 index 0000000..3f6066f --- /dev/null +++ b/src/com/djoker/glteste/TesteTexRender.hx @@ -0,0 +1,483 @@ +package com.djoker.glteste; + +import com.engine.game.Entity; +import com.engine.game.Screen; +import com.engine.render.BlendMode; +import com.engine.render.filter.BlurFilter; +import com.engine.render.filter.BlurYFilter; +import com.engine.render.filter.BlurXFilter; +import com.engine.render.filter.ColorMatrixFilter; +import com.engine.render.filter.CrossHatchFilter; +import com.engine.render.filter.DotScreenFilter; +import com.engine.render.filter.InvertFilter; +import com.engine.render.filter.NormalFilter; +import com.engine.render.filter.GrayFilter; +import com.engine.render.filter.ColorStepFilter; +import com.engine.render.filter.PixelateFilter; +import com.engine.render.filter.RenderFilter; +import com.engine.render.filter.RGBSplitFilter; +import com.engine.render.filter.SepiaFilter; +import com.engine.render.filter.TwistFilter; +import com.engine.render.SpriteBatch; +import com.engine.render.BatchPrimitives; +import com.engine.render.Texture; +import com.engine.input.Keys; + +import flash.text.TextField; +import flash.text.TextFormat; + + +/** + * ... + * @author djoker + */ +class TesteTexRender extends Screen +{ + + + var batch:SpriteBatch; + + + var primitives:BatchPrimitives; + var child:Entity; + + var player:Entity; + var logo:Entity; +var back:Entity; + + var filterIndex:Int = 0; + var redy:Bool = false; + + var fblurX:BlurXFilter; + var fblurY:BlurYFilter; + var finvert:InvertFilter; + var fNormal:NormalFilter; + var fgary:GrayFilter; + var fColorStep:ColorStepFilter; + + var filter:RenderFilter; + + var value:Float=0; + + + var caption:TextField; + + var skew:Float = 0; + + + override public function show() + { + + + batch = new SpriteBatch(1000); + + + caption = new TextField(); + caption.x = game.gameWidth / 2-100; + caption.y = 20; + caption.width = 200; + caption.defaultTextFormat = new TextFormat ("_sans", 12, 0xffff00); + caption.text = "Render Filter"; + caption.selectable = false; + game.addChild(caption); + + var label = new TextField(); + label.x = 5; + label.y = game.gameHeight-25; + label.width = 400; + label.defaultTextFormat = new TextFormat ("_sans", 22, 0xffff00); + label.text = "Left/Right keys switch filters"; + label.selectable = false; + game.addChild(label); + + + + + player = new Entity(300, 300, getTexture("assets/zazaka.png",true)); + child = new Entity(0, 0, getTexture("assets/zazaka.png",true)); + child.blue = 0; + player.add(child); + + logo= new Entity(100+this.width/2,this.height/2,getTexture("assets/hxlogo.png",true)); + + back = new Entity(512/2, 512/2, getTexture("assets/texture.jpg", true)); + // back.scaleX = 0.5; + // back.scaleY = 0.5; + + //texRender = new NormalFilter(game.screenWidth, game.screenHeight); + //texRender = new BlurXFilter(game.screenWidth, game.screenHeight); + primitives = new BatchPrimitives( 500); + + filterIndex = 0; + setFilter(filterIndex); + + game.clarColor(0, 0, 0); + + + } + override public function update(dt:Float) + { + + + + player.rotation += game.deltaTime * 2.1; + child.rotation -= game.deltaTime * 2.5; + player.skewX += game.deltaTime * 0.1; + + skew +=game.deltaTime * 1; + + logo.skewX = Math.sin(skew)*1; + logo.skewY = Math.cos(skew)*1; + + + } + + public function setFilter(index:Int) + { + switch (index) + { + case 0: + { + + + caption.text = "Render Normal Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new NormalFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new NormalFilter(game.screenWidth, game.screenHeight); + } + + } + case 1: + { + value = 4.5; + caption.text = "Render Color Step Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new ColorStepFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new ColorStepFilter(game.screenWidth, game.screenHeight); + } + + } + case 2: + { + caption.text = "Render Gray Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new GrayFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new GrayFilter(game.screenWidth, game.screenHeight); + } + + } + case 3: + { + value = 0.8; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new InvertFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new InvertFilter(game.screenWidth, game.screenHeight); + } + } + case 4: + { + caption.text = "Render Blur X Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new BlurXFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new BlurXFilter(game.screenWidth, game.screenHeight); + } + } + case 5: + { + caption.text = "Render Blur Y Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new BlurYFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new BlurYFilter(game.screenWidth, game.screenHeight); + } + } + + case 6: + { + + value = 0.5; + caption.text = "Render Twist Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new TwistFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new TwistFilter(game.screenWidth, game.screenHeight); + } + } + case 7: + { + + + caption.text = "Render Sepia Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new SepiaFilter(game.screenWidth, game.screenHeight); + + + } else + { + filter =new SepiaFilter(game.screenWidth, game.screenHeight); + } + } + case 8: + { + + + caption.text = "Render Blur Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new BlurFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new BlurFilter(game.screenWidth, game.screenHeight); + } + } + case 9: + { + + + caption.text = "Render Pixelate Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new PixelateFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new PixelateFilter(game.screenWidth, game.screenHeight); + } + } + case 10: + { + value = 0; + caption.text = "Render Dot Screen Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new DotScreenFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new DotScreenFilter(game.screenWidth, game.screenHeight); + } + } + case 11: + { + value = 0; + caption.text = "Render Split RGB Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new RGBSplitFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new RGBSplitFilter(game.screenWidth, game.screenHeight); + } + } + case 12: + { + value = 0; + caption.text = "Render Cross hatch Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new CrossHatchFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new CrossHatchFilter(game.screenWidth, game.screenHeight); + } + } + case 13: + { + value = 0; + caption.text = "Render Color Matrix Transformation Filter"; + if (filter != null) + { + filter.dispose(); + filter = null; + filter = new ColorMatrixFilter(game.screenWidth, game.screenHeight); + + } else + { + filter =new ColorMatrixFilter(game.screenWidth, game.screenHeight); + } + } + } + redy = true; + } + public function renderToFilter(index:Int) + { + if (!redy) return; + + + switch (index) + { + + case 1: + { + + value += (game.deltaTime*0.1); + if (value > 10) value = 0.5; + var dataFilter:ColorStepFilter = cast(filter, ColorStepFilter); + dataFilter.setStep(value); + + + } + + case 3: + { + + value += (game.deltaTime*0.1); + if (value > 1) value = 0.0; + var dataFilter:InvertFilter = cast(filter, InvertFilter); + dataFilter.setInvert(value); + + + } + + + case 6: + { + + value += (game.deltaTime*1.1); + if (value > 5) value = -1; + var dataFilter:TwistFilter = cast(filter, TwistFilter); + dataFilter.setRadius(value); + + + } + + + case 13: + { + value += (game.deltaTime*1.1); + if (value > 100) value = 0; + + + var dataFilter:ColorMatrixFilter = cast(filter, ColorMatrixFilter); + dataFilter.setTransformation(Math.sin(value),Math.cos(value),value,1); + + + } + + } + + if (filter != null) + { + filter.begin(); + normalRender(); + filter.end(); + filter.render(); + } + + + } + override public function keyUp(key:Int) + { + redy = false; + if (key == Keys.RIGHT) + { + filterIndex++; + } else + if (key == Keys.LEFT) + { + filterIndex--; + } + if (filterIndex <= 0) filterIndex = 0; + if (filterIndex >= 13) filterIndex = 13; + value = 1; + setFilter(filterIndex); + + } + public function normalRender() + { + + batch.Begin(); + batch.drawEntity(back); + batch.drawEntity(logo); + batch.drawEntity(player,true); + batch.End(); + + primitives.begin(); + + + primitives.line(10, 10, 100, 100, 1, 0, 1); + primitives.rect(100, 100, 90, 120, 1, 1, 1); + primitives.circle(100, 100, 12, 8, 1, 1, 1, 1); + primitives.ellipse(300, 90, 55, 15, 8, 1, 1, 1, 1); + + primitives.fillrect(200, 200, 50, 50, 1, 0, 0, 1); + primitives.fillrect(280, 200, 50, 50, 0, 1, 1, 1); + primitives.fillcircle(200, 100, 8, 18, 1, 0, 1, 1); + primitives.fillellipse(300, 100, 55, 15, 8, 0, 1, 1, 1); + + + primitives.end(); + } + + override public function render() + { + renderToFilter(filterIndex); + } + + + + +override public function mouseDown(mousex:Float, mousey:Float) +{ + +} + + + +} \ No newline at end of file diff --git a/src/com/djoker/glteste/TesteTiles.hx b/src/com/djoker/glteste/TesteTiles.hx index d82512e..715e59c 100755 --- a/src/com/djoker/glteste/TesteTiles.hx +++ b/src/com/djoker/glteste/TesteTiles.hx @@ -80,7 +80,7 @@ class TesteTiles extends Screen } - override public function render(dt:Float) + override public function render() { diff --git a/src/com/engine/game/Game.hx b/src/com/engine/game/Game.hx index b4a2c0d..c05dab6 100755 --- a/src/com/engine/game/Game.hx +++ b/src/com/engine/game/Game.hx @@ -1,6 +1,14 @@ package com.engine.game; -import com.engine.math.Matrix; + +import com.engine.render.BlendMode; +import com.engine.render.Camera; +import com.engine.render.Texture; +import com.engine.render.filter.Filter; +import com.engine.math.Vector2; +import com.engine.misc.Util; +import com.engine.ui.Text; + import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; @@ -15,6 +23,10 @@ import openfl.display.FPS; import openfl.display.OpenGLView; import openfl.gl.GL; +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.geom.Point; + @@ -26,6 +38,18 @@ import openfl.gl.GL; class Game extends OpenGLView { +public static var viewWidth:Int = 0; +public static var viewHeight:Int = 0; +public static var game:Game; +public static var now:Int = 0; +public static var then:Int = 0; +public static var frameStart:Int = 0; +public static var fps:Int = 0; +public static var dt:Float = 0; +public static var frames:Int = 0; +public static var fixedTimestep:Bool=true; +public static var camera:Camera; + private var ready:Bool; public var deltaTime:Float; private var prevFrame:Int; @@ -33,24 +57,21 @@ class Game extends OpenGLView private var mMultiTouch:Bool; private var screen:Screen = null; private var container:Sprite; - static public var scrollX:Float = 0; - static public var scrollY:Float = 0; - static public var viewWidth:Int = 0; - static public var viewHeight:Int = 0; + //value from the windows resize public var screenWidth:Int = 0; public var screenHeight:Int = 0; + //values from the game initiate public var gameWidth:Int=0; public var gameHeight:Int = 0; - private var rescale:Bool = false; - private var enableDepth:Bool; - -public var red:Float; -public var green:Float; -public var blue:Float; - static public var projMatrix:Matrix; - + private var rescale:Bool = false; + private var enableDepth:Bool; + public var red:Float; + public var green:Float; + public var blue:Float; + private var textures:Map; + private var requestedFramerate:Int; @@ -64,26 +85,25 @@ public var blue:Float; public function new() { super(); + Game.game = this; ready = false; this.render = renderView; - - - - - - + screenWidth = Lib.current.stage.stageWidth; screenHeight = Lib.current.stage.stageHeight; - Game.viewWidth = screenHeight; - Game.viewHeight = screenHeight; + requestedFramerate = Std.int(Lib.current.stage.frameRate); + viewWidth = screenWidth; + viewHeight = screenHeight; gameWidth = screenWidth; gameHeight = screenHeight; + Game.camera = new Camera(screenWidth,screenHeight); + textures= new Map(); + + - - Game.projMatrix=Matrix.OrthoOffCenterLH(0, gameWidth,gameHeight,0, -1, 1); stage.addEventListener(Event.RESIZE, onResize); @@ -131,6 +151,8 @@ public var blue:Float; container.addChild(child); } + + private function addedToStage(e:Event) { @@ -145,6 +167,8 @@ public var blue:Float; Lib.current.stage.addEventListener (MouseEvent.MOUSE_UP, doMouseUp); Lib.current.stage.addEventListener (KeyboardEvent.KEY_DOWN, stage_onKeyDown); Lib.current.stage.addEventListener (KeyboardEvent.KEY_UP, stage_onKeyUp); + //Lib.current.stage.addEventListener (Event.ENTER_FRAME, onEnterFrame); + if (mMultiTouch) @@ -164,10 +188,13 @@ public var blue:Float; GL.pixelStorei(GL.PACK_ALIGNMENT, 2); // GL.enable(GL.DEPTH_TEST); setDeph(true); - clarColor(0, 1, 0.4); + clarColor(0, 0, 0.4); GL.clearColor(red, green, blue, 1); GL.depthMask(true); - + GL.colorMask(true, true, true, true); + GL.activeTexture(GL.TEXTURE0); + + begin(); @@ -228,7 +255,17 @@ public var blue:Float; } - private function focusLost(e:Event) {trace("end game"); ready = false; end(); } + private function focusLost(e:Event) + { + ready = false; + end(); + for (tex in this.textures) + { + tex.dispose(); + } + + textures = null; + } private function onResize(e:Event) { screenWidth = Lib.current.stage.stageWidth; @@ -244,10 +281,17 @@ public var blue:Float; // trace("resize :" + width + "X" + height); if (screen != null) screen.resize(width, height); } - public function update(dt:Float) + public function onUpdate(dt:Float) + { + + } + + public function onRender() { - if (screen != null) screen.render(dt); + if (screen != null) screen.update(dt); + if (screen != null) screen.render(); } + public function keyDown(key:Int) { }; public function keyUp(key:Int) { }; @@ -269,9 +313,20 @@ public var blue:Float; } } + +private function onEnterFrame (event:Event):Void +{ +onUpdate(dt); +} + private function renderView(rect:Rectangle):Void { + + updateTimer(); + + + var timer:Int = getTimer(); viewWidth = Std.int(rect.width); viewHeight = Std.int(rect.height); @@ -292,16 +347,17 @@ private function renderView(rect:Rectangle):Void var margin_x:Float = (screenWidth - gameWidth * scale_w) / 2; var margin_y:Float = (screenHeight - gameHeight * scale_h) / 2; - GL.viewport (Std.int (margin_x), Std.int (margin_y), Std.int (gameWidth*scale_w), Std.int (gameHeight*scale_h)); - Game.projMatrix=Matrix.OrthoOffCenterLH(0, gameWidth/ar_origin, gameHeight/ar_origin,0, -1000, 1000); + GL.viewport (Std.int (margin_x), Std.int (margin_y), Std.int (gameWidth * scale_w), Std.int (gameHeight * scale_h)); + if (camera!=null) camera.resize( gameWidth / ar_origin, gameHeight / ar_origin); } else { GL.viewport (Std.int (rect.x), Std.int (rect.y), Std.int (rect.width), Std.int (rect.height)); - Game.projMatrix=Matrix.OrthoOffCenterLH(0, gameWidth,gameHeight,0, -1, 1); + if (camera!=null)camera.resize( viewWidth , viewHeight ); + //if (camera!=null)camera.resize( gameWidth,gameHeight ); } - - + if (camera!=null)camera.update(); + nextFrame = Lib.getTimer(); @@ -315,21 +371,66 @@ private function renderView(rect:Rectangle):Void { GL.clear(GL.COLOR_BUFFER_BIT ); } - // GL.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); - + if (ready) { - update(deltaTime); + + onRender(); } - + GL.disableVertexAttribArray (Filter.vertexAttribute); + GL.disableVertexAttribArray (Filter.texCoordAttribute); + GL.disableVertexAttribArray (Filter.colorAttribute); GL.bindBuffer (GL.ARRAY_BUFFER, null); GL.useProgram (null); - GL.blendFunc(GL.SRC_ALPHA,GL.DST_ALPHA ); - prevFrame = nextFrame; + GL.blendFunc(GL.SRC_ALPHA, GL.DST_ALPHA ); + + +// + +timer = getTimer(); +prevFrame = nextFrame; } +public function getTexture(url:String, ?flip:Bool = false ):Texture +{ + if (textures.exists(url)) + { + return textures.get(url); + } else + { + var tex = new Texture(); + tex.load(url, flip); + textures.set(url,tex); + return tex; + } +} +private function updateTimer() +{ +then = now; +now = getTimer(); +dt = then == 0 ? 0 : (now - then) / 1000; +if (fixedTimestep) { +dt = 1 / requestedFramerate; +} + +frames++; +if (now - frameStart >= 1000) +{ + fps = Std.int(Math.min(requestedFramerate, frames)); +frames = 0; +frameStart = now; +} +} + +public function getTimer():Int +{ + return Lib.getTimer(); +} + + + } \ No newline at end of file diff --git a/src/com/engine/game/Screen.hx b/src/com/engine/game/Screen.hx index ce2d2f0..e245fcb 100755 --- a/src/com/engine/game/Screen.hx +++ b/src/com/engine/game/Screen.hx @@ -1,5 +1,7 @@ package com.engine.game; + +import com.engine.render.Texture; /** * ... * @author djoker @@ -13,7 +15,8 @@ class Screen extends GameObject public var game:Game = null; public function show() { } - public function render(dt:Float) { } + public function render() { } + public function update(dt:Float) { } public function resize(width:Int, height:Int) {} public function mouseMove(mousex:Float, mousey:Float) { }; @@ -22,4 +25,11 @@ class Screen extends GameObject public function keyDown(key:Int) { }; public function keyUp(key:Int) { }; + + public function getTexture(url:String, ?flip:Bool = false ):Texture +{ + + return game.getTexture(url, flip); +} + } \ No newline at end of file diff --git a/src/com/engine/game/Transform.hx b/src/com/engine/game/Transform.hx index 8f4d97f..dff7a3a 100755 --- a/src/com/engine/game/Transform.hx +++ b/src/com/engine/game/Transform.hx @@ -1,7 +1,7 @@ package com.engine.game; import flash.geom.Matrix; -import com.engine.misc.MatrixHelp; +import com.engine.misc.Util; /** * ... * @author djoker @@ -41,14 +41,14 @@ class Transform mTransformationMatrix.identity(); - var cx:Float = Game.scrollX; - var cy:Float = Game.scrollY; + var cx:Float = Game.camera.scrollX; + var cy:Float = Game.camera.scrollY; var sx:Float = x - cx * scrollFactorX; var sy:Float = y - cy * scrollFactorY; if (scaleX != 1.0 || scaleY != 1.0) mTransformationMatrix.scale(scaleX, scaleY); - if (skewX != 0.0 || skewY != 0.0) MatrixHelp.skew(mTransformationMatrix, skewX, skewY); + if (skewX != 0.0 || skewY != 0.0) Util.skew(mTransformationMatrix, skewX, skewY); if (rotation != 0.0) mTransformationMatrix.rotate(rotation); if (sx != 0.0 || sy != 0.0) mTransformationMatrix.translate(sx, sy); diff --git a/src/com/engine/input/Keys.hx b/src/com/engine/input/Keys.hx new file mode 100755 index 0000000..2a2bac3 --- /dev/null +++ b/src/com/engine/input/Keys.hx @@ -0,0 +1,107 @@ +package com.engine.input; + +/** + * ... + * @author djoker + */ +class Keys +{ + +public inline static var ANY = -1; + + public inline static var LEFT = 37; + public inline static var UP = 38; + public inline static var RIGHT = 39; + public inline static var DOWN = 40; + + public inline static var ENTER = 13; + public inline static var COMMAND = 15; + public inline static var CONTROL = 17; + public inline static var SPACE = 32; + public inline static var SHIFT = 16; + public inline static var BACKSPACE = 8; + public inline static var CAPS_LOCK = 20; + public inline static var DELETE = 46; + public inline static var END = 35; + public inline static var ESCAPE = 27; + public inline static var HOME = 36; + public inline static var INSERT = 45; + public inline static var TAB = 9; + public inline static var PAGE_DOWN = 34; + public inline static var PAGE_UP = 33; + public inline static var LEFT_SQUARE_BRACKET = 219; + public inline static var RIGHT_SQUARE_BRACKET = 221; + public inline static var TILDE = 192; + + public inline static var A = 65; + public inline static var B = 66; + public inline static var C = 67; + public inline static var D = 68; + public inline static var E = 69; + public inline static var F = 70; + public inline static var G = 71; + public inline static var H = 72; + public inline static var I = 73; + public inline static var J = 74; + public inline static var K = 75; + public inline static var L = 76; + public inline static var M = 77; + public inline static var N = 78; + public inline static var O = 79; + public inline static var P = 80; + public inline static var Q = 81; + public inline static var R = 82; + public inline static var S = 83; + public inline static var T = 84; + public inline static var U = 85; + public inline static var V = 86; + public inline static var W = 87; + public inline static var X = 88; + public inline static var Y = 89; + public inline static var Z = 90; + + public inline static var F1 = 112; + public inline static var F2 = 113; + public inline static var F3 = 114; + public inline static var F4 = 115; + public inline static var F5 = 116; + public inline static var F6 = 117; + public inline static var F7 = 118; + public inline static var F8 = 119; + public inline static var F9 = 120; + public inline static var F10 = 121; + public inline static var F11 = 122; + public inline static var F12 = 123; + public inline static var F13 = 124; + public inline static var F14 = 125; + public inline static var F15 = 126; + + public inline static var DIGIT_0 = 48; + public inline static var DIGIT_1 = 49; + public inline static var DIGIT_2 = 50; + public inline static var DIGIT_3 = 51; + public inline static var DIGIT_4 = 52; + public inline static var DIGIT_5 = 53; + public inline static var DIGIT_6 = 54; + public inline static var DIGIT_7 = 55; + public inline static var DIGIT_8 = 56; + public inline static var DIGIT_9 = 57; + + public inline static var NUMPAD_0 = 96; + public inline static var NUMPAD_1 = 97; + public inline static var NUMPAD_2 = 98; + public inline static var NUMPAD_3 = 99; + public inline static var NUMPAD_4 = 100; + public inline static var NUMPAD_5 = 101; + public inline static var NUMPAD_6 = 102; + public inline static var NUMPAD_7 = 103; + public inline static var NUMPAD_8 = 104; + public inline static var NUMPAD_9 = 105; + public inline static var NUMPAD_ADD = 107; + public inline static var NUMPAD_DECIMAL = 110; + public inline static var NUMPAD_DIVIDE = 111; + public inline static var NUMPAD_ENTER = 108; + public inline static var NUMPAD_MULTIPLY = 106; + public inline static var NUMPAD_SUBTRACT = 109; + +} \ No newline at end of file diff --git a/src/com/engine/math/Frustum.hx b/src/com/engine/math/Frustum.hx deleted file mode 100755 index 69f5dcd..0000000 --- a/src/com/engine/math/Frustum.hx +++ /dev/null @@ -1,65 +0,0 @@ -package com.engine.math; - - - -class Frustum { - - public static function GetPlanes(transform:Matrix):Array { - var frustumPlanes = []; - - for (index in 0...6) { - frustumPlanes.push(new Plane(0, 0, 0, 0)); - } - - Frustum.GetPlanesToRef(transform, frustumPlanes); - - return frustumPlanes; - } - - inline public static function GetPlanesToRef(transform:Matrix, frustumPlanes:Array):Array { - // Near - frustumPlanes[0].normal.x = transform.m[3] + transform.m[2]; - frustumPlanes[0].normal.y = transform.m[7] + transform.m[6]; - frustumPlanes[0].normal.z = transform.m[10] + transform.m[10]; - frustumPlanes[0].d = transform.m[15] + transform.m[14]; - frustumPlanes[0].normalize(); - - // Far - frustumPlanes[1].normal.x = transform.m[3] - transform.m[2]; - frustumPlanes[1].normal.y = transform.m[7] - transform.m[6]; - frustumPlanes[1].normal.z = transform.m[11] - transform.m[10]; - frustumPlanes[1].d = transform.m[15] - transform.m[14]; - frustumPlanes[1].normalize(); - - // Left - frustumPlanes[2].normal.x = transform.m[3] + transform.m[0]; - frustumPlanes[2].normal.y = transform.m[7] + transform.m[4]; - frustumPlanes[2].normal.z = transform.m[11] + transform.m[8]; - frustumPlanes[2].d = transform.m[15] + transform.m[12]; - frustumPlanes[2].normalize(); - - // Right - frustumPlanes[3].normal.x = transform.m[3] - transform.m[0]; - frustumPlanes[3].normal.y = transform.m[7] - transform.m[4]; - frustumPlanes[3].normal.z = transform.m[11] - transform.m[8]; - frustumPlanes[3].d = transform.m[15] - transform.m[12]; - frustumPlanes[3].normalize(); - - // Top - frustumPlanes[4].normal.x = transform.m[3] - transform.m[1]; - frustumPlanes[4].normal.y = transform.m[7] - transform.m[5]; - frustumPlanes[4].normal.z = transform.m[11] - transform.m[9]; - frustumPlanes[4].d = transform.m[15] - transform.m[13]; - frustumPlanes[4].normalize(); - - // Bottom - frustumPlanes[5].normal.x = transform.m[3] + transform.m[1]; - frustumPlanes[5].normal.y = transform.m[7] + transform.m[5]; - frustumPlanes[5].normal.z = transform.m[11] + transform.m[9]; - frustumPlanes[5].d = transform.m[15] + transform.m[13]; - frustumPlanes[5].normalize(); - - return frustumPlanes; - } - -} diff --git a/src/com/engine/math/Matrix.hx b/src/com/engine/math/Matrix.hx deleted file mode 100755 index 4cdd3f6..0000000 --- a/src/com/engine/math/Matrix.hx +++ /dev/null @@ -1,768 +0,0 @@ -package com.engine.math; - -import openfl.utils.Float32Array; - - - -class Matrix { - - public var m:Array; - - public function new() { - m = []; - } - - inline public function isIdentity():Bool { - var ret:Bool = true; - if (this.m[0] != 1.0 || this.m[5] != 1.0 || this.m[10] != 1.0 || this.m[15] != 1.0) - ret = false; - - if (this.m[1] != 0.0 || this.m[2] != 0.0 || this.m[3] != 0.0 || - this.m[4] != 0.0 || this.m[6] != 0.0 || this.m[7] != 0.0 || - this.m[8] != 0.0 || this.m[9] != 0.0 || this.m[11] != 0.0 || - this.m[12] != 0.0 || this.m[13] != 0.0 || this.m[14] != 0.0) - ret = false; - - return ret; - } - - inline public function determinant():Float { - var temp1 = (this.m[10] * this.m[15]) - (this.m[11] * this.m[14]); - var temp2 = (this.m[9] * this.m[15]) - (this.m[11] * this.m[13]); - var temp3 = (this.m[9] * this.m[14]) - (this.m[10] * this.m[13]); - var temp4 = (this.m[8] * this.m[15]) - (this.m[11] * this.m[12]); - var temp5 = (this.m[8] * this.m[14]) - (this.m[10] * this.m[12]); - var temp6 = (this.m[8] * this.m[13]) - (this.m[9] * this.m[12]); - - return ((((this.m[0] * (((this.m[5] * temp1) - (this.m[6] * temp2)) + (this.m[7] * temp3))) - (this.m[1] * (((this.m[4] * temp1) - - (this.m[6] * temp4)) + (this.m[7] * temp5)))) + (this.m[2] * (((this.m[4] * temp2) - (this.m[5] * temp4)) + (this.m[7] * temp6)))) - - (this.m[3] * (((this.m[4] * temp3) - (this.m[5] * temp5)) + (this.m[6] * temp6)))); - } - - inline public function toArray():Array - { - return this.m; - } - - inline public function invert() { - this.invertToRef(this); - } - - inline public function invertToRef(other:Matrix) { - var l1 = this.m[0]; - var l2 = this.m[1]; - var l3 = this.m[2]; - var l4 = this.m[3]; - var l5 = this.m[4]; - var l6 = this.m[5]; - var l7 = this.m[6]; - var l8 = this.m[7]; - var l9 = this.m[8]; - var l10 = this.m[9]; - var l11 = this.m[10]; - var l12 = this.m[11]; - var l13 = this.m[12]; - var l14 = this.m[13]; - var l15 = this.m[14]; - var l16 = this.m[15]; - var l17 = (l11 * l16) - (l12 * l15); - var l18 = (l10 * l16) - (l12 * l14); - var l19 = (l10 * l15) - (l11 * l14); - var l20 = (l9 * l16) - (l12 * l13); - var l21 = (l9 * l15) - (l11 * l13); - var l22 = (l9 * l14) - (l10 * l13); - var l23 = ((l6 * l17) - (l7 * l18)) + (l8 * l19); - var l24 = -(((l5 * l17) - (l7 * l20)) + (l8 * l21)); - var l25 = ((l5 * l18) - (l6 * l20)) + (l8 * l22); - var l26 = -(((l5 * l19) - (l6 * l21)) + (l7 * l22)); - var l27 = 1.0 / ((((l1 * l23) + (l2 * l24)) + (l3 * l25)) + (l4 * l26)); - var l28 = (l7 * l16) - (l8 * l15); - var l29 = (l6 * l16) - (l8 * l14); - var l30 = (l6 * l15) - (l7 * l14); - var l31 = (l5 * l16) - (l8 * l13); - var l32 = (l5 * l15) - (l7 * l13); - var l33 = (l5 * l14) - (l6 * l13); - var l34 = (l7 * l12) - (l8 * l11); - var l35 = (l6 * l12) - (l8 * l10); - var l36 = (l6 * l11) - (l7 * l10); - var l37 = (l5 * l12) - (l8 * l9); - var l38 = (l5 * l11) - (l7 * l9); - var l39 = (l5 * l10) - (l6 * l9); - - other.m[0] = l23 * l27; - other.m[4] = l24 * l27; - other.m[8] = l25 * l27; - other.m[12] = l26 * l27; - other.m[1] = -(((l2 * l17) - (l3 * l18)) + (l4 * l19)) * l27; - other.m[5] = (((l1 * l17) - (l3 * l20)) + (l4 * l21)) * l27; - other.m[9] = -(((l1 * l18) - (l2 * l20)) + (l4 * l22)) * l27; - other.m[13] = (((l1 * l19) - (l2 * l21)) + (l3 * l22)) * l27; - other.m[2] = (((l2 * l28) - (l3 * l29)) + (l4 * l30)) * l27; - other.m[6] = -(((l1 * l28) - (l3 * l31)) + (l4 * l32)) * l27; - other.m[10] = (((l1 * l29) - (l2 * l31)) + (l4 * l33)) * l27; - other.m[14] = -(((l1 * l30) - (l2 * l32)) + (l3 * l33)) * l27; - other.m[3] = -(((l2 * l34) - (l3 * l35)) + (l4 * l36)) * l27; - other.m[7] = (((l1 * l34) - (l3 * l37)) + (l4 * l38)) * l27; - other.m[11] = -(((l1 * l35) - (l2 * l37)) + (l4 * l39)) * l27; - other.m[15] = (((l1 * l36) - (l2 * l38)) + (l3 * l39)) * l27; - } - - inline public function setTranslation(vector3:Vector3) { - this.m[12] = vector3.x; - this.m[13] = vector3.y; - this.m[14] = vector3.z; - } - - inline public function multiply(other:Matrix):Matrix { - var result = new Matrix(); - this.multiplyToRef(other, result); - return result; - } - - inline public function copyFrom(other:Matrix) { - for (index in 0...16) { - this.m[index] = other.m[index]; - } - } - - inline public function multiplyToRef(other:Matrix, result:Matrix) { - this.multiplyToArray(other, result.m, 0); - } - inline public static function MatrixMultiply4x4(A:Matrix,B :Matrix) - { - var result = new Matrix(); - - - result.m[0] = A.m[0]*B.m[0] + A.m[4]*B.m[1] + A.m[8]*B.m[2] + A.m[12]*B.m[3]; - result.m[1] = A.m[1]*B.m[0] + A.m[5]*B.m[1] + A.m[9]*B.m[2] + A.m[13]*B.m[3]; - result.m[2] = A.m[2]*B.m[0] + A.m[6]*B.m[1] + A.m[10]*B.m[2] + A.m[14]*B.m[3]; - result.m[3] = A.m[3]*B.m[0] + A.m[7]*B.m[1] + A.m[11]*B.m[2] + A.m[15]*B.m[3]; - - result.m[4] = A.m[0]*B.m[4] + A.m[4]*B.m[5] + A.m[8]*B.m[6] + A.m[12]*B.m[7]; - result.m[5] = A.m[1]*B.m[4] + A.m[5]*B.m[5] + A.m[9]*B.m[6] + A.m[13]*B.m[7]; - result.m[6] = A.m[2]*B.m[4] + A.m[6]*B.m[5] + A.m[10]*B.m[6] + A.m[14]*B.m[7]; - result.m[7] = A.m[3]*B.m[4] + A.m[7]*B.m[5] + A.m[11]*B.m[6] + A.m[15]*B.m[7]; - - result.m[8] = A.m[0]*B.m[8] + A.m[4]*B.m[9] + A.m[8]*B.m[10] + A.m[12]*B.m[11]; - result.m[9] = A.m[1]*B.m[8] + A.m[5]*B.m[9] + A.m[9]*B.m[10] + A.m[13]*B.m[11]; - result.m[10] = A.m[2]*B.m[8] + A.m[6]*B.m[9] + A.m[10]*B.m[10] + A.m[14]*B.m[11]; - result.m[11] = A.m[3]*B.m[8] + A.m[7]*B.m[9] + A.m[11]*B.m[10] + A.m[15]*B.m[11]; - - result.m[12] = A.m[0]*B.m[12] + A.m[4]*B.m[13] + A.m[8]*B.m[14] + A.m[12]*B.m[15]; - result.m[13] = A.m[1]*B.m[12] + A.m[5]*B.m[13] + A.m[9]*B.m[14] + A.m[13]*B.m[15]; - result.m[14] = A.m[2]*B.m[12] + A.m[6]*B.m[13] + A.m[10]*B.m[14] + A.m[14]*B.m[15]; - result.m[15] = A.m[3] * B.m[12] + A.m[7] * B.m[13] + A.m[11] * B.m[14] + A.m[15] * B.m[15]; - - return result; - } - - inline public function Multiply4x4(A:Matrix,B :Matrix) - { - - - m[0] = A.m[0]*B.m[0] + A.m[4]*B.m[1] + A.m[8]*B.m[2] + A.m[12]*B.m[3]; - m[1] = A.m[1]*B.m[0] + A.m[5]*B.m[1] + A.m[9]*B.m[2] + A.m[13]*B.m[3]; - m[2] = A.m[2]*B.m[0] + A.m[6]*B.m[1] + A.m[10]*B.m[2] + A.m[14]*B.m[3]; - m[3] = A.m[3]*B.m[0] + A.m[7]*B.m[1] + A.m[11]*B.m[2] + A.m[15]*B.m[3]; - - m[4] = A.m[0]*B.m[4] + A.m[4]*B.m[5] + A.m[8]*B.m[6] + A.m[12]*B.m[7]; - m[5] = A.m[1]*B.m[4] + A.m[5]*B.m[5] + A.m[9]*B.m[6] + A.m[13]*B.m[7]; - m[6] = A.m[2]*B.m[4] + A.m[6]*B.m[5] + A.m[10]*B.m[6] + A.m[14]*B.m[7]; - m[7] = A.m[3]*B.m[4] + A.m[7]*B.m[5] + A.m[11]*B.m[6] + A.m[15]*B.m[7]; - - m[8] = A.m[0]*B.m[8] + A.m[4]*B.m[9] + A.m[8]*B.m[10] + A.m[12]*B.m[11]; - m[9] = A.m[1]*B.m[8] + A.m[5]*B.m[9] + A.m[9]*B.m[10] + A.m[13]*B.m[11]; - m[10] = A.m[2]*B.m[8] + A.m[6]*B.m[9] + A.m[10]*B.m[10] + A.m[14]*B.m[11]; - m[11] = A.m[3]*B.m[8] + A.m[7]*B.m[9] + A.m[11]*B.m[10] + A.m[15]*B.m[11]; - - m[12] = A.m[0]*B.m[12] + A.m[4]*B.m[13] + A.m[8]*B.m[14] + A.m[12]*B.m[15]; - m[13] = A.m[1]*B.m[12] + A.m[5]*B.m[13] + A.m[9]*B.m[14] + A.m[13]*B.m[15]; - m[14] = A.m[2]*B.m[12] + A.m[6]*B.m[13] + A.m[10]*B.m[14] + A.m[14]*B.m[15]; - m[15] = A.m[3] * B.m[12] + A.m[7] * B.m[13] + A.m[11] * B.m[14] + A.m[15] * B.m[15]; - - } - - - inline public function multiplyToArray(other:Matrix, result:Array, offset:Int):Array { - - var tm0 = this.m[0]; - var tm1 = this.m[1]; - var tm2 = this.m[2]; - var tm3 = this.m[3]; - var tm4 = this.m[4]; - var tm5 = this.m[5]; - var tm6 = this.m[6]; - var tm7 = this.m[7]; - var tm8 = this.m[8]; - var tm9 = this.m[9]; - var tm10 = this.m[10]; - var tm11 = this.m[11]; - var tm12 = this.m[12]; - var tm13 = this.m[13]; - var tm14 = this.m[14]; - var tm15 = this.m[15]; - - var om0 = other.m[0]; - var om1 = other.m[1]; - var om2 = other.m[2]; - var om3 = other.m[3]; - var om4 = other.m[4]; - var om5 = other.m[5]; - var om6 = other.m[6]; - var om7 = other.m[7]; - var om8 = other.m[8]; - var om9 = other.m[9]; - var om10 = other.m[10]; - var om11 = other.m[11]; - var om12 = other.m[12]; - var om13 = other.m[13]; - var om14 = other.m[14]; - var om15 = other.m[15]; - - result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12; - result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13; - result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14; - result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15; - - result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12; - result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13; - result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14; - result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15; - - result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12; - result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13; - result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14; - result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15; - - result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12; - result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13; - result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14; - result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15; - - return result; - } - - inline public function equals(value:Matrix):Bool { - return (this.m[0] == value.m[0] && this.m[1] == value.m[1] && this.m[2] == value.m[2] && this.m[3] == value.m[3] && - this.m[4] == value.m[4] && this.m[5] == value.m[5] && this.m[6] == value.m[6] && this.m[7] == value.m[7] && - this.m[8] == value.m[8] && this.m[9] == value.m[9] && this.m[10] == value.m[10] && this.m[11] == value.m[11] && - this.m[12] == value.m[12] && this.m[13] == value.m[13] && this.m[14] == value.m[14] && this.m[15] == value.m[15]); - } - - inline public function clone():Matrix { - return Matrix.FromValues(this.m[0], this.m[1], this.m[2], this.m[3], - this.m[4], this.m[5], this.m[6], this.m[7], - this.m[8], this.m[9], this.m[10], this.m[11], - this.m[12], this.m[13], this.m[14], this.m[15]); - } - - - inline public static function FromArray(array:Array, offset:Int = 0):Matrix { - var result = new Matrix(); - Matrix.FromArrayToRef(array, offset, result); - return result; - } - - inline public static function FromArrayToRef(array:Array, offset:Int = 0, result:Matrix):Matrix { - for (index in 0...16) { - result.m[index] = array[index + offset]; - } - return result; - } - - inline public function fillArrayTo(array:Array) - { - for (index in 0...16) - { - m[index] = array[index]; - } - } - - inline public static function FromValues(m11:Float, m12:Float, m13:Float, m14:Float, - m21:Float, m22:Float, m23:Float, m24:Float, - m31:Float, m32:Float, m33:Float, m34:Float, - m41:Float, m42:Float, m43:Float, m44:Float):Matrix { - - var result = new Matrix(); - - result.m[0] = m11; - result.m[1] = m12; - result.m[2] = m13; - result.m[3] = m14; - result.m[4] = m21; - result.m[5] = m22; - result.m[6] = m23; - result.m[7] = m24; - result.m[8] = m31; - result.m[9] = m32; - result.m[10] = m33; - result.m[11] = m34; - result.m[12] = m41; - result.m[13] = m42; - result.m[14] = m43; - result.m[15] = m44; - - return result; - } - - inline public static function FromValuesToRef(m11:Float, m12:Float, m13:Float, m14:Float, - m21:Float, m22:Float, m23:Float, m24:Float, - m31:Float, m32:Float, m33:Float, m34:Float, - m41:Float, m42:Float, m43:Float, m44:Float, result:Matrix):Matrix { - - result.m[0] = m11; - result.m[1] = m12; - result.m[2] = m13; - result.m[3] = m14; - result.m[4] = m21; - result.m[5] = m22; - result.m[6] = m23; - result.m[7] = m24; - result.m[8] = m31; - result.m[9] = m32; - result.m[10] = m33; - result.m[11] = m34; - result.m[12] = m41; - result.m[13] = m42; - result.m[14] = m43; - result.m[15] = m44; - - return result; - } - - inline public static function Identity():Matrix { - return Matrix.FromValues( - 1.0, 0, 0, 0, - 0, 1.0, 0, 0, - 0, 0, 1.0, 0, - 0, 0, 0, 1.0 - ); - } - - inline public static function IdentityToRef(result:Matrix):Matrix { - Matrix.FromValuesToRef( - 1.0, 0, 0, 0, - 0, 1.0, 0, 0, - 0, 0, 1.0, 0, - 0, 0, 0, 1.0, result - ); - - return result; - } - - inline public static function Zero():Matrix { - return Matrix.FromValues( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0 - ); - } - - inline public static function RotationX(angle:Float):Matrix { - var result = new Matrix(); - Matrix.RotationXToRef(angle, result); - - return result; - } - - inline public static function RotationXToRef(angle:Float, result:Matrix):Matrix { - var s = Math.sin(angle); - var c = Math.cos(angle); - - result.m[0] = 1.0; - result.m[15] = 1.0; - - result.m[5] = c; - result.m[10] = c; - result.m[9] = -s; - result.m[6] = s; - - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - - return result; - } - - inline public static function RotationY(angle:Float):Matrix { - var result = new Matrix(); - Matrix.RotationYToRef(angle, result); - - return result; - } - - inline public static function RotationYToRef(angle:Float, result:Matrix):Matrix { - var s = Math.sin(angle); - var c = Math.cos(angle); - - result.m[5] = 1.0; - result.m[15] = 1.0; - - result.m[0] = c; - result.m[2] = -s; - result.m[8] = s; - result.m[10] = c; - - result.m[1] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[6] = 0; - result.m[7] = 0; - result.m[9] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - - return result; - } - - inline public static function RotationZ(angle:Float):Matrix { - var result = new Matrix(); - Matrix.RotationZToRef(angle, result); - - return result; - } - - inline public static function RotationZToRef(angle:Float, result:Matrix):Matrix { - var s = Math.sin(angle); - var c = Math.cos(angle); - - result.m[10] = 1.0; - result.m[15] = 1.0; - - result.m[0] = c; - result.m[1] = s; - result.m[4] = -s; - result.m[5] = c; - - result.m[2] = 0; - result.m[3] = 0; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - - return result; - } - - inline public static function RotationAxis(axis:Vector3, angle:Float):Matrix { - var s = Math.sin(-angle); - var c = Math.cos(-angle); - var c1 = 1 - c; - - axis.normalize(); - var result = Matrix.Zero(); - - result.m[0] = (axis.x * axis.x) * c1 + c; - result.m[1] = (axis.x * axis.y) * c1 - (axis.z * s); - result.m[2] = (axis.x * axis.z) * c1 + (axis.y * s); - result.m[3] = 0.0; - - result.m[4] = (axis.y * axis.x) * c1 + (axis.z * s); - result.m[5] = (axis.y * axis.y) * c1 + c; - result.m[6] = (axis.y * axis.z) * c1 - (axis.x * s); - result.m[7] = 0.0; - - result.m[8] = (axis.z * axis.x) * c1 - (axis.y * s); - result.m[9] = (axis.z * axis.y) * c1 + (axis.x * s); - result.m[10] = (axis.z * axis.z) * c1 + c; - result.m[11] = 0.0; - - result.m[15] = 1.0; - - return result; - } - - inline public static function RotationYawPitchRoll(yaw:Float, pitch:Float, roll:Float):Matrix { - var result = new Matrix(); - Matrix.RotationYawPitchRollToRef(yaw, pitch, roll, result); - - return result; - } - - inline public static function RotationYawPitchRollToRef(yaw:Float, pitch:Float, roll:Float, result:Matrix):Matrix { - var tempQuaternion = new Quaternion(); // For RotationYawPitchRoll - tempQuaternion = Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, tempQuaternion); - - return tempQuaternion.toRotationMatrix(result); - } - - inline public static function Scaling(x:Float, y:Float, z:Float):Matrix { - var result = Matrix.Zero(); - Matrix.ScalingToRef(x, y, z, result); - - return result; - } - - inline public static function ScalingToRef(x:Float, y:Float, z:Float, result:Matrix):Matrix { - result.m[0] = x; - result.m[1] = 0; - result.m[2] = 0; - result.m[3] = 0; - result.m[4] = 0; - result.m[5] = y; - result.m[6] = 0; - result.m[7] = 0; - result.m[8] = 0; - result.m[9] = 0; - result.m[10] = z; - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - - return result; - } - - inline public static function Translation(x:Float, y:Float, z:Float):Matrix { - var result = Matrix.Identity(); - Matrix.TranslationToRef(x, y, z, result); - - return result; - } - - inline public static function TranslationToRef(x:Float, y:Float, z:Float, result:Matrix) { - Matrix.FromValuesToRef( - 1.0, 0, 0, 0, - 0, 1.0, 0, 0, - 0, 0, 1.0, 0, - x, y, z, 1.0, result - ); - } - - inline public static function LookAtLH(eye:Vector3, target:Vector3, up:Vector3):Matrix { - var result = Matrix.Zero(); - Matrix.LookAtLHToRef(eye, target, up, result); - - return result; - } - - inline public static function LookAtLHToRef(eye:Vector3, target:Vector3, up:Vector3, result:Matrix):Matrix { - var xAxis = Vector3.Zero(); - var yAxis = Vector3.Zero(); - var zAxis = Vector3.Zero(); - - // Z axis - target.subtractToRef(eye, zAxis); - zAxis.normalize(); - - // X axis - Vector3.CrossToRef(up, zAxis, xAxis); - xAxis.normalize(); - - // Y axis - Vector3.CrossToRef(zAxis, xAxis, yAxis); - yAxis.normalize(); - - // Eye angles - var ex = -Vector3.Dot(xAxis, eye); - var ey = -Vector3.Dot(yAxis, eye); - var ez = -Vector3.Dot(zAxis, eye); - - return Matrix.FromValuesToRef(xAxis.x, yAxis.x, zAxis.x, 0, - xAxis.y, yAxis.y, zAxis.y, 0, - xAxis.z, yAxis.z, zAxis.z, 0, - ex, ey, ez, 1, result); - } - - inline public static function OrthoLH(width:Float, height:Float, znear:Float, zfar:Float):Matrix { - var hw = 2.0 / width; - var hh = 2.0 / height; - var id = 1.0 / (zfar - znear); - var nid = znear / (znear - zfar); - - return Matrix.FromValues( - hw, 0, 0, 0, - 0, hh, 0, 0, - 0, 0, id, 0, - 0, 0, nid, 1 - ); - } - - inline public static function OrthoOffCenterLH(left:Float, right:Float, bottom:Float, top:Float, znear:Float, zfar:Float):Matrix { - var matrix = Matrix.Zero(); - Matrix.OrthoOffCenterLHToRef(left, right, bottom, top, znear, zfar, matrix); - - return matrix; - } - - inline public static function OrthoOffCenterLHToRef(left:Float, right:Float, bottom:Float, top:Float, znear:Float, zfar:Float, result:Matrix):Matrix { - result.m[0] = 2.0 / (right - left); - result.m[1] = result.m[2] = result.m[3] = result.m[4] = 0; - result.m[5] = 2.0 / (top - bottom); - result.m[6] = result.m[7] = 0; - result.m[8] = result.m[9] = 0; - result.m[10] = -1 / (znear - zfar); - result.m[11] = 0; - result.m[12] = (left + right) / (left - right); - result.m[13] = (top + bottom) / (bottom - top); - result.m[14] = znear / (znear - zfar); - result.m[15] = 1.0; - - - return result; - } - - inline public static function PerspectiveLH(width:Float, height:Float, znear:Float, zfar:Float):Matrix { - var matrix = Matrix.Zero(); - - matrix.m[0] = (2.0 * znear) / width; - matrix.m[1] = matrix.m[2] = matrix.m[3] = 0.0; - matrix.m[5] = (2.0 * znear) / height; - matrix.m[4] = matrix.m[6] = matrix.m[7] = 0.0; - matrix.m[10] = -zfar / (znear - zfar); - matrix.m[8] = matrix.m[9] = 0.0; - matrix.m[11] = 1.0; - matrix.m[12] = matrix.m[13] = matrix.m[15] = 0.0; - matrix.m[14] = (znear * zfar) / (znear - zfar); - - return matrix; - } - - inline public static function PerspectiveFovLH(fov:Float, aspect:Float, znear:Float, zfar:Float):Matrix { - var matrix = Matrix.Zero(); - Matrix.PerspectiveFovLHToRef(fov, aspect, znear, zfar, matrix); - - return matrix; - } - - inline public static function PerspectiveFovLHToRef(fov:Float, aspect:Float, znear:Float, zfar:Float, result:Matrix):Matrix { - var tan = 1.0 / (Math.tan(fov * 0.5)); - - result.m[0] = tan / aspect; - result.m[1] = result.m[2] = result.m[3] = 0.0; - result.m[5] = tan; - result.m[4] = result.m[6] = result.m[7] = 0.0; - result.m[8] = result.m[9] = 0.0; - result.m[10] = -zfar / (znear - zfar); - result.m[11] = 1.0; - result.m[12] = result.m[13] = result.m[15] = 0.0; - result.m[14] = (znear * zfar) / (znear - zfar); - - return result; - } - -/* - - inline public static function GetFinalMatrix(viewport:Viewport, world:Matrix, view:Matrix, projection:Matrix, zmin:Float, zmax:Float):Matrix { - var cw = viewport.width; - var ch = viewport.height; - var cx = viewport.x; - var cy = viewport.y; - - var viewportMatrix = Matrix.FromValues( - cw / 2.0, 0, 0, 0, - 0, -ch / 2.0, 0, 0, - 0, 0, zmax - zmin, 0, - cx + cw / 2.0, ch / 2.0 + cy, zmin, 1 - ); - - return world.multiply(view).multiply(projection).multiply(viewportMatrix); - } - */ - inline public static function Transpose(matrix:Matrix):Matrix { - var result = new Matrix(); - - result.m[0] = matrix.m[0]; - result.m[1] = matrix.m[4]; - result.m[2] = matrix.m[8]; - result.m[3] = matrix.m[12]; - - result.m[4] = matrix.m[1]; - result.m[5] = matrix.m[5]; - result.m[6] = matrix.m[9]; - result.m[7] = matrix.m[13]; - - result.m[8] = matrix.m[2]; - result.m[9] = matrix.m[6]; - result.m[10] = matrix.m[10]; - result.m[11] = matrix.m[14]; - - result.m[12] = matrix.m[3]; - result.m[13] = matrix.m[7]; - result.m[14] = matrix.m[11]; - result.m[15] = matrix.m[15]; - - return result; - } - - inline public static function Reflection(plane:Plane):Matrix { - var matrix = new Matrix(); - Matrix.ReflectionToRef(plane, matrix); - - return matrix; - } - - public function set2Dtransformation(x:Float, y:Float, scale:Float = 1, rotation:Float = 0) - { - var theta = rotation * Math.PI / 180.0; - var c = Math.cos(theta); - var s = Math.sin(theta); - - fillArrayTo([ - c*scale, -s*scale, 0, 0, - s*scale, c*scale, 0, 0, - 0, 0, 1, 0, - x, y, 0, 1 - ]); - - } - - inline public static function create2D(x:Float, y:Float, scale:Float = 1, rotation:Float = 0) - { - var theta = rotation * Math.PI / 180.0; - var c = Math.cos(theta); - var s = Math.sin(theta); - - return Matrix.FromArray([ - c*scale, -s*scale, 0, 0, - s*scale, c*scale, 0, 0, - 0, 0, 1, 0, - x, y, 0, 1 - ]); - - } - - inline public static function ReflectionToRef(plane:Plane, result:Matrix):Matrix { - plane.normalize(); - var x = plane.normal.x; - var y = plane.normal.y; - var z = plane.normal.z; - var temp = -2 * x; - var temp2 = -2 * y; - var temp3 = -2 * z; - result.m[0] = (temp * x) + 1; - result.m[1] = temp2 * x; - result.m[2] = temp3 * x; - result.m[3] = 0.0; - result.m[4] = temp * y; - result.m[5] = (temp2 * y) + 1; - result.m[6] = temp3 * y; - result.m[7] = 0.0; - result.m[8] = temp * z; - result.m[9] = temp2 * z; - result.m[10] = (temp3 * z) + 1; - result.m[11] = 0.0; - result.m[12] = temp * plane.d; - result.m[13] = temp2 * plane.d; - result.m[14] = temp3 * plane.d; - result.m[15] = 1.0; - - return result; - } - -} diff --git a/src/com/engine/math/Plane.hx b/src/com/engine/math/Plane.hx deleted file mode 100755 index 31912de..0000000 --- a/src/com/engine/math/Plane.hx +++ /dev/null @@ -1,118 +0,0 @@ -package com.engine.math; - - - - -class Plane { - - public var normal:Vector3; - public var d:Float; - - public function new(a:Float, b:Float, c:Float, d:Float) { - this.normal = new Vector3(a, b, c); - this.d = d; - } - - public function clone():Plane { - return new Plane(this.normal.x, this.normal.y, this.normal.z, this.d); - } - - inline public function normalize() { - var norm = (Math.sqrt((this.normal.x * this.normal.x) + (this.normal.y * this.normal.y) + (this.normal.z * this.normal.z))); - var magnitude:Float = 0; - - if (norm != 0) { - magnitude = 1.0 / norm; - } - - this.normal.x *= magnitude; - this.normal.y *= magnitude; - this.normal.z *= magnitude; - - this.d *= magnitude; - } - - inline public function transform(transformation:Matrix):Plane { - var transposedMatrix = Matrix.Transpose(transformation); - var x = this.normal.x; - var y = this.normal.y; - var z = this.normal.z; - var d = this.d; - - var normalX = (((x * transposedMatrix.m[0]) + (y * transposedMatrix.m[1])) + (z * transposedMatrix.m[2])) + (d * transposedMatrix.m[3]); - var normalY = (((x * transposedMatrix.m[4]) + (y * transposedMatrix.m[5])) + (z * transposedMatrix.m[6])) + (d * transposedMatrix.m[7]); - var normalZ = (((x * transposedMatrix.m[8]) + (y * transposedMatrix.m[9])) + (z * transposedMatrix.m[10])) + (d * transposedMatrix.m[11]); - var finalD = (((x * transposedMatrix.m[12]) + (y * transposedMatrix.m[13])) + (z * transposedMatrix.m[14])) + (d * transposedMatrix.m[15]); - - return new Plane(normalX, normalY, normalZ, finalD); - } - - inline public function dotCoordinate(point:Vector3):Float { - return ((((this.normal.x * point.x) + (this.normal.y * point.y)) + (this.normal.z * point.z)) + this.d); - } - - inline public function copyFromPoints(point1:Vector3, point2:Vector3, point3:Vector3) { - var x1 = point2.x - point1.x; - var y1 = point2.y - point1.y; - var z1 = point2.z - point1.z; - var x2 = point3.x - point1.x; - var y2 = point3.y - point1.y; - var z2 = point3.z - point1.z; - var yz = (y1 * z2) - (z1 * y2); - var xz = (z1 * x2) - (x1 * z2); - var xy = (x1 * y2) - (y1 * x2); - var pyth = (Math.sqrt((yz * yz) + (xz * xz) + (xy * xy))); - var invPyth; - - if (pyth != 0) { - invPyth = 1.0 / pyth; - } - else { - invPyth = 0; - } - - this.normal.x = yz * invPyth; - this.normal.y = xz * invPyth; - this.normal.z = xy * invPyth; - this.d = -((this.normal.x * point1.x) + (this.normal.y * point1.y) + (this.normal.z * point1.z)); - } - - inline public function isFrontFacingTo(direction:Vector3, epsilon:Float):Bool { - var dot = Vector3.Dot(this.normal, direction); - - return (dot <= epsilon); - } - - inline public function signedDistanceTo(point:Vector3):Float { - return Vector3.Dot(point, this.normal) + this.d; - } - - - inline public static function FromArray(array:Array):Plane { - return new Plane(array[0], array[1], array[2], array[3]); - } - - inline public static function FromPoints(point1:Vector3, point2:Vector3, point3:Vector3):Plane { - var result = new Plane(0, 0, 0, 0); - result.copyFromPoints(point1, point2, point3); - - return result; - } - - inline public static function FromPositionAndNormal(origin:Vector3, normal:Vector3):Plane { - var result = new Plane(0, 0, 0, 0); - normal.normalize(); - - result.normal = normal; - result.d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); - - return result; - } - - inline public static function SignedDistanceToPlaneFromPositionAndNormal(origin:Vector3, normal:Vector3, point:Vector3):Float { - var d = -(normal.x * origin.x + normal.y * origin.y + normal.z * origin.z); - - return Vector3.Dot(point, normal) + d; - } - -} diff --git a/src/com/engine/math/Quaternion.hx b/src/com/engine/math/Quaternion.hx deleted file mode 100755 index 04395c0..0000000 --- a/src/com/engine/math/Quaternion.hx +++ /dev/null @@ -1,190 +0,0 @@ -package com.engine.math; - - - - -class Quaternion { - - public var x:Float; - public var y:Float; - public var z:Float; - public var w:Float; - - public function toString():String { - return "{X: " + this.x + " Y:" + this.y + " Z:" + this.z + " W:" + this.w + "}"; - } - - public function new(initialX:Float = 0, initialY:Float = 0, initialZ:Float = 0, initialW:Float = 0) { - this.x = initialX; - this.y = initialY; - this.z = initialZ; - this.w = initialW; - } - - inline public function equals(otherQuaternion:Quaternion):Bool { - return this.x == otherQuaternion.x && this.y == otherQuaternion.y && this.z == otherQuaternion.z && this.w == otherQuaternion.w; - } - - inline public function clone():Quaternion { - return new Quaternion(this.x, this.y, this.z, this.w); - } - - inline public function copyFrom(other:Quaternion) { - this.x = other.x; - this.y = other.y; - this.z = other.z; - this.w = other.w; - } - - inline public function add(other:Quaternion):Quaternion { - return new Quaternion(this.x + other.x, this.y + other.y, this.z + other.z, this.w + other.w); - } - - inline public function scale(value:Float):Quaternion { - return new Quaternion(this.x * value, this.y * value, this.z * value, this.w * value); - } - - inline public function multiply(q1:Quaternion):Quaternion { - var result = new Quaternion(0, 0, 0, 1.0); - this.multiplyToRef(q1, result); - - return result; - } - - inline public function multiplyToRef(q1:Quaternion, result:Quaternion):Quaternion { - result.x = this.x * q1.w + this.y * q1.z - this.z * q1.y + this.w * q1.x; - result.y = -this.x * q1.z + this.y * q1.w + this.z * q1.x + this.w * q1.y; - result.z = this.x * q1.y - this.y * q1.x + this.z * q1.w + this.w * q1.z; - result.w = -this.x * q1.x - this.y * q1.y - this.z * q1.z + this.w * q1.w; - - return result; - } - - inline public function length():Float { - return Math.sqrt((this.x * this.x) + (this.y * this.y) + (this.z * this.z) + (this.w * this.w)); - } - - inline public function normalize() { - var length = 1.0 / this.length(); - this.x *= length; - this.y *= length; - this.z *= length; - this.w *= length; - } - - inline public function toEulerAngles():Vector3 { - var qx = this.x; - var qy = this.y; - var qz = this.z; - var qw = this.w; - - var sqx = qx * qx; - var sqy = qy * qy; - var sqz = qz * qz; - - var yaw = Math.atan2(2.0 * (qy * qw - qx * qz), 1.0 - 2.0 * (sqy + sqz)); - var pitch = Math.asin(2.0 * (qx * qy + qz * qw)); - var roll = Math.atan2(2.0 * (qx * qw - qy * qz), 1.0 - 2.0 * (sqx + sqz)); - - var gimbaLockTest = qx * qy + qz * qw; - if (gimbaLockTest > 0.499) { - yaw = 2.0 * Math.atan2(qx, qw); - roll = 0; - } else if (gimbaLockTest < -0.499) { - yaw = -2.0 * Math.atan2(qx, qw); - roll = 0; - } - - return new Vector3(pitch, yaw, roll); - } - - inline public function toRotationMatrix(result:Matrix):Matrix { - var xx = this.x * this.x; - var yy = this.y * this.y; - var zz = this.z * this.z; - var xy = this.x * this.y; - var zw = this.z * this.w; - var zx = this.z * this.x; - var yw = this.y * this.w; - var yz = this.y * this.z; - var xw = this.x * this.w; - - result.m[0] = 1.0 - (2.0 * (yy + zz)); - result.m[1] = 2.0 * (xy + zw); - result.m[2] = 2.0 * (zx - yw); - result.m[3] = 0; - result.m[4] = 2.0 * (xy - zw); - result.m[5] = 1.0 - (2.0 * (zz + xx)); - result.m[6] = 2.0 * (yz + xw); - result.m[7] = 0; - result.m[8] = 2.0 * (zx + yw); - result.m[9] = 2.0 * (yz - xw); - result.m[10] = 1.0 - (2.0 * (yy + xx)); - result.m[11] = 0; - result.m[12] = 0; - result.m[13] = 0; - result.m[14] = 0; - result.m[15] = 1.0; - - return result; - } - - - inline public static function FromArray(array:Array, offset:Int = 0):Quaternion { - return new Quaternion(array[offset], array[offset + 1], array[offset + 2], array[offset + 3]); - } - - inline public static function RotationYawPitchRoll(yaw:Float, pitch:Float, roll:Float):Quaternion { - var result = new Quaternion(); - Quaternion.RotationYawPitchRollToRef(yaw, pitch, roll, result); - - return result; - } - - inline public static function RotationYawPitchRollToRef(yaw:Float, pitch:Float, roll:Float, result:Quaternion):Quaternion { - var halfRoll = roll * 0.5; - var halfPitch = pitch * 0.5; - var halfYaw = yaw * 0.5; - - var sinRoll = Math.sin(halfRoll); - var cosRoll = Math.cos(halfRoll); - var sinPitch = Math.sin(halfPitch); - var cosPitch = Math.cos(halfPitch); - var sinYaw = Math.sin(halfYaw); - var cosYaw = Math.cos(halfYaw); - - result.x = (cosYaw * sinPitch * cosRoll) + (sinYaw * cosPitch * sinRoll); - result.y = (sinYaw * cosPitch * cosRoll) - (cosYaw * sinPitch * sinRoll); - result.z = (cosYaw * cosPitch * sinRoll) - (sinYaw * sinPitch * cosRoll); - result.w = (cosYaw * cosPitch * cosRoll) + (sinYaw * sinPitch * sinRoll); - - return result; - } - - inline public static function Slerp(left:Quaternion, right:Quaternion, amount:Float):Quaternion { - var num2:Float; - var num3:Float; - var num = amount; - var num4 = (((left.x * right.x) + (left.y * right.y)) + (left.z * right.z)) + (left.w * right.w); - var flag = false; - - if (num4 < 0) { - flag = true; - num4 = -num4; - } - - if (num4 > 0.999999) { - num3 = 1 - num; - num2 = flag ? -num : num; - } - else { - var num5 = Math.acos(num4); - var num6 = (1.0 / Math.sin(num5)); - num3 = (Math.sin((1.0 - num) * num5)) * num6; - num2 = flag ? ((-Math.sin(num * num5)) * num6) : ((Math.sin(num * num5)) * num6); - } - - return new Quaternion((num3 * left.x) + (num2 * right.x), (num3 * left.y) + (num2 * right.y), (num3 * left.z) + (num2 * right.z), (num3 * left.w) + (num2 * right.w)); - } - -} diff --git a/src/com/engine/math/Vector2.hx b/src/com/engine/math/Vector2.hx index 3da4814..595f303 100755 --- a/src/com/engine/math/Vector2.hx +++ b/src/com/engine/math/Vector2.hx @@ -1,5 +1,7 @@ package com.engine.math; +import flash.geom.Matrix; +import flash.geom.Point; class Vector2 { @@ -163,14 +165,14 @@ class Vector2 { return new Vector2(_x, _y); } - + /* inline public static function Transform(vector:Vector2, transformation:Matrix):Vector2 { var _x = (vector.x * transformation.m[0]) + (vector.y * transformation.m[4]); var _y = (vector.x * transformation.m[1]) + (vector.y * transformation.m[5]); return new Vector2(_x, _y); } - + */ inline public static function Distance(value1:Vector2, value2:Vector2):Float { return Math.sqrt(Vector2.DistanceSquared(value1, value2)); } diff --git a/src/com/engine/math/Vector3.hx b/src/com/engine/math/Vector3.hx index dd53ab0..051e419 100755 --- a/src/com/engine/math/Vector3.hx +++ b/src/com/engine/math/Vector3.hx @@ -210,7 +210,7 @@ class Vector3 { public static function Up():Vector3 { return new Vector3(0, 1.0, 0); } - + /* inline public static function TransformCoordinates(vector:Vector3, transformation:Matrix):Vector3 { var result = Vector3.Zero(); @@ -263,7 +263,7 @@ class Vector3 { result.z = (x * transformation.m[2]) + (y * transformation.m[6]) + (z * transformation.m[10]); } - +*/ inline public static function CatmullRom(value1:Vector3, value2:Vector3, value3:Vector3, value4:Vector3, amount:Float):Vector3 { var squared = amount * amount; var cubed = amount * squared; @@ -349,7 +349,7 @@ class Vector3 { result.normalize(); } - +/* inline public static function Project(vector:Vector3, world:Matrix, transform:Matrix, viewport:Clip):Vector3 { var cw = viewport.width; var ch = viewport.height; @@ -381,7 +381,7 @@ class Vector3 { return vector; } - +*/ inline public static function Minimize(left:Vector3, right:Vector3):Vector3 { var x = (left.x < right.x) ? left.x : right.x; var y = (left.y < right.y) ? left.y : right.y; diff --git a/src/com/engine/misc/MatrixHelp.hx b/src/com/engine/misc/MatrixHelp.hx deleted file mode 100755 index 561c2bd..0000000 --- a/src/com/engine/misc/MatrixHelp.hx +++ /dev/null @@ -1,66 +0,0 @@ -package com.engine.misc; - -import flash.geom.Matrix; - -import flash.display.Bitmap; -import flash.display.BitmapData; - -/** - * ... - * @author djoker - */ -class MatrixHelp -{ - - - inline static public function getScaled(source:BitmapData, newWidth:Int, newHeight:Int):BitmapData - { - var m:flash.geom.Matrix = new flash.geom.Matrix(); - m.scale(newWidth / source.width, newHeight / source.height); - - var bmp:BitmapData = new BitmapData(newWidth, newHeight, true); - - bmp.draw(source, m); - return bmp; - } - - inline static public function flipBitmapData(original:BitmapData, axis:String = "y"):BitmapData -{ - var flipped:BitmapData = new BitmapData(original.width, original.height, true, 0); - var matrix:Matrix; - if(axis == "x"){ - matrix = new Matrix( -1, 0, 0, 1, original.width, 0); - } else { - matrix = new Matrix( 1, 0, 0, -1, 0, original.height); - } - flipped.draw(original, matrix, null, null, null, true); - return flipped; -} - -public static function skew(matrix:Matrix, skewX:Float, skewY:Float) - { - var sinX:Float = Math.sin(skewX); - var cosX:Float = Math.cos(skewX); - var sinY:Float = Math.sin(skewY); - var cosY:Float = Math.cos(skewY); - - setTo(matrix,matrix.a * cosY - matrix.b * sinX, - matrix.a * sinY + matrix.b * cosX, - matrix.c * cosY - matrix.d * sinX, - matrix.c * sinY + matrix.d * cosX, - matrix.tx * cosY - matrix.ty * sinX, - matrix.tx * sinY + matrix.ty * cosX); - } - public static function setTo (matrix:Matrix, a:Float, b:Float, c:Float, d:Float, tx:Float, ty:Float):Void - { - - matrix.a = a; - matrix.b = b; - matrix.c = c; - matrix.d = d; - matrix.tx = tx; - matrix.ty = ty; - - } - -} \ No newline at end of file diff --git a/src/com/engine/misc/Util.hx b/src/com/engine/misc/Util.hx index 1f35ded..f3e30a8 100755 --- a/src/com/engine/misc/Util.hx +++ b/src/com/engine/misc/Util.hx @@ -1,6 +1,11 @@ package com.engine.misc; +import flash.Lib; +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.display.Bitmap; +import flash.display.BitmapData; /** @@ -13,7 +18,12 @@ package com.engine.misc; static public var RAD:Float = Math.PI / -180; static public var EPSILON:Float = 0.00000001; - +static public function getTime():Int +{ + return Lib.getTimer(); +} + + static public function randf(max:Float, min:Float ):Float { return Math.random() * (max - min) + min; @@ -92,5 +102,128 @@ static public function randi(max:Int, min:Int ):Int return result; } } + + + inline static public function getScaled(source:BitmapData, newWidth:Int, newHeight:Int):BitmapData + { + var m:flash.geom.Matrix = new flash.geom.Matrix(); + m.scale(newWidth / source.width, newHeight / source.height); + + var bmp:BitmapData = new BitmapData(newWidth, newHeight, true,0); + + bmp.draw(source, m); + return bmp; + } + + inline static public function flipBitmapData(original:BitmapData, axis:String = "y"):BitmapData +{ + var flipped:BitmapData = new BitmapData(original.width, original.height, true, 0); + var matrix:Matrix; + if(axis == "x"){ + matrix = new Matrix( -1, 0, 0, 1, original.width, 0); + } else { + matrix = new Matrix( 1, 0, 0, -1, 0, original.height); + } + flipped.draw(original, matrix, null, null, null, true); + return flipped; +} + +public static function skew(matrix:Matrix, skewX:Float, skewY:Float) + { + var sinX:Float = Math.sin(skewX); + var cosX:Float = Math.cos(skewX); + var sinY:Float = Math.sin(skewY); + var cosY:Float = Math.cos(skewY); + + setTo(matrix,matrix.a * cosY - matrix.b * sinX, + matrix.a * sinY + matrix.b * cosX, + matrix.c * cosY - matrix.d * sinX, + matrix.c * sinY + matrix.d * cosX, + matrix.tx * cosY - matrix.ty * sinX, + matrix.tx * sinY + matrix.ty * cosX); + } + public static function setTo (matrix:Matrix, a:Float, b:Float, c:Float, d:Float, tx:Float, ty:Float):Void + { + + matrix.a = a; + matrix.b = b; + matrix.c = c; + matrix.d = d; + matrix.tx = tx; + matrix.ty = ty; + + } + + public static function fillMatrix3DArrayTo(mat:Matrix3D,array:Array) + { + for (index in 0...16) + { + + // mat.rawData[index] = array[index]; + } + } + public static function createOrtho(x0:Float, x1:Float, y0:Float, y1:Float, zNear:Float, zFar:Float) :Matrix3D + { + var sx = 1.0 / (x1 - x0); + var sy = 1.0 / (y1 - y0); + var sz = 1.0 / (zFar - zNear); + + return new Matrix3D([ + 2.0*sx, 0, 0, 0, + 0, 2.0*sy, 0, 0, + 0, 0, -2.0*sz, 0, + - (x0+x1)*sx, - (y0+y1)*sy, - (zNear+zFar)*sz, 1, + ]); + } + public static function setMatrixOrtho(mat:Matrix3D,x0:Float, x1:Float, y0:Float, y1:Float, zNear:Float, zFar:Float) + { + var sx = 1.0 / (x1 - x0); + var sy = 1.0 / (y1 - y0); + var sz = 1.0 / (zFar - zNear); + + fillMatrix3DArrayTo(mat,[ + 2.0*sx, 0, 0, 0, + 0, 2.0*sy, 0, 0, + 0, 0, -2.0*sz, 0, + - (x0+x1)*sx, - (y0+y1)*sy, - (zNear+zFar)*sz, 1, + ]); + } + + public static function set2Dtransformation(mat:Matrix3D,x:Float, y:Float, scale:Float = 1, rotation:Float = 0) + { + var theta = rotation * Math.PI / 180.0; + var c = Math.cos(theta); + var s = Math.sin(theta); +/* + fillMatrix3DArrayTo(mat,[ + c*scale, -s*scale, 0, 0, + s*scale, c*scale , 0, 0, + 0, 0, 1, 0, + x, y, 0, 1 + ]); + */ + } + + public static function createMtrix2D(x:Float, y:Float, scale:Float = 1, rotation:Float = 0):Matrix3D + { + var theta = rotation * Math.PI / 180.0; + var c = Math.cos(theta); + var s = Math.sin(theta); + + var mat:Matrix3D = new Matrix3D([ + c*scale, -s*scale, 0, 0, + s*scale, c*scale, 0, 0, + 0, 0, 1, 0, + x, y, 0, 1 + ]);/* + return Matrix.FromArray([ + c*scale, -s*scale, 0, 0, + s*scale, c*scale, 0, 0, + 0, 0, 1, 0, + x, y, 0, 1 + ]); + */ + return mat; + } } \ No newline at end of file diff --git a/src/com/engine/render/BatchPrimitives.hx b/src/com/engine/render/BatchPrimitives.hx index 733f612..2fb92cf 100755 --- a/src/com/engine/render/BatchPrimitives.hx +++ b/src/com/engine/render/BatchPrimitives.hx @@ -1,6 +1,10 @@ package com.engine.render; +import flash.geom.Matrix; +import flash.geom.Point; + import com.engine.game.Game; + import openfl.gl.GL; import openfl.gl.GLBuffer; import openfl.utils.Float32Array; @@ -62,6 +66,8 @@ class BatchPrimitives extends Buffer idxPos=0; idxCols = 0; + scrollx = 0; + scrolly = 0; fidxPos=0; fidxCols = 0; @@ -124,17 +130,17 @@ public function fcolor(r:Float, g:Float,b:Float, ?a:Float =0.0) idxCols = 0; fidxPos=0; fidxCols = 0; + update(); } public function end() { - shader.Enable(); BlendMode.setBlend(currentBlendMode); - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(Game.projMatrix.toArray())); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.bindBuffer(GL.ARRAY_BUFFER, this.fvertexBuffer); GL.bufferSubData(GL.ARRAY_BUFFER, 0, this.fvertices); GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, 0, 0); diff --git a/src/com/engine/render/BlendMode.hx b/src/com/engine/render/BlendMode.hx index e92e78a..8387e0e 100755 --- a/src/com/engine/render/BlendMode.hx +++ b/src/com/engine/render/BlendMode.hx @@ -15,19 +15,24 @@ public static var NORMAL:Int = 0; public static var ADD:Int = 1; public static var MULTIPLY:Int = 2; public static var SCREEN:Int = 3; +public static var TRANSPARENT:Int = 4; + + static public function setBlend(mode:Int ) { switch( mode ) { - case 0: + case BlendMode.NORMAL: GL.blendFunc(GL.SRC_ALPHA,GL.ONE_MINUS_SRC_ALPHA ); - case 1: + case BlendMode.ADD: GL.blendFunc(GL.SRC_ALPHA, GL.DST_ALPHA ); - case 2: + case BlendMode.MULTIPLY: GL.blendFunc(GL.DST_COLOR,GL.ONE_MINUS_SRC_ALPHA ); - case 3: - GL.blendFunc(GL.SRC_ALPHA,GL.ONE ); + case BlendMode.SCREEN: + GL.blendFunc(GL.SRC_ALPHA, GL.ONE ); + case BlendMode.TRANSPARENT: + GL.blendFunc(GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); default: GL.blendFunc(GL.ONE,GL.ONE_MINUS_SRC_ALPHA ); } diff --git a/src/com/engine/render/Block.hx b/src/com/engine/render/Block.hx new file mode 100755 index 0000000..3e775c4 --- /dev/null +++ b/src/com/engine/render/Block.hx @@ -0,0 +1,131 @@ +package com.engine.render; + +import flash.geom.Rectangle; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + +import com.engine.game.Game; +import com.engine.render.filter.Filter; +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.geom.Vector3D; + +/** + * ... + * @author djoker + */ +class Block +{ + + private var vertexBuffer:GLBuffer; + private var indexBuffer:GLBuffer; + public var width:Int; + public var height:Int; + public var vertices:Array; + public var indices:Array; + public var index:Int; + public var vertexStrideSize:Int; + public var vMin:Vector3D; + public var vMax:Vector3D; + public var AMin:Vector3D; + public var AMax:Vector3D; + public var bound:Rectangle; + public var triangles:Int; + + + + + public function new(width:Int, height:Int) + { + vertexStrideSize = (3 + 2 + 4) * 4 ; + this.width = width; + this.height = height; + vertices = new Array(); + indices = new Array(); + index = 0; + vMin = new Vector3D(1000, 1000); + vMax = new Vector3D(-1000, -1000); + AMin = new Vector3D(1000, 1000); + AMax = new Vector3D(-1000, -1000); + bound = new Rectangle(); + + } + public function updateBound() + { + setBound(AMin.x, AMin.y, AMax.x, AMax.y); + } + public function setBound(minX:Float, minY:Float, maxX:Float , maxY:Float) + { + bound.left = minX; + bound.top = minY; + bound.right = maxX - minX; + bound.bottom=maxY - minY; + } + public function addVertex(x:Float, y:Float, u:Float, v:Float,?alpha:Float=1) + { + vertices.push(x); + vertices.push(y); + vertices.push(0); + vertices.push(u); + vertices.push(v); + vertices.push(1); + vertices.push(1); + vertices.push(1); + vertices.push(alpha); + } + public function build() + { + indexBuffer = GL.createBuffer(); + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); + GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, new Int16Array(indices), GL.STATIC_DRAW); + vertexBuffer = GL.createBuffer(); + GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); + GL.bufferData(GL.ARRAY_BUFFER, new Float32Array(vertices), GL.STATIC_DRAW); + getAABB(); + triangles = indices.length; + indices = null; + vertices = null; + } + public function render() + { + GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); + GL.vertexAttribPointer(Filter.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); + GL.vertexAttribPointer(Filter.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); + GL.vertexAttribPointer(Filter.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + GL.drawElements(GL.TRIANGLES, triangles, GL.UNSIGNED_SHORT, 0); + } + public function getAABB() + { + var x:Float; + var y:Float; + + var ELEMENTS_PER_VERTEX:Int = 9; + var offset:Int=0; + + + + for (i in 0...vertices.length) + { + x = vertices[offset]; + y = vertices[offset+1]; + offset += ELEMENTS_PER_VERTEX; + + if (vMin.x > x) vMin.x = x; + if (vMax.x < x) vMax.x = x; + if (vMin.y > y) vMin.y = y; + if (vMax.y < y) vMax.y = y; + } + + + } + + public function dispose() + { + GL.deleteBuffer(indexBuffer); + GL.deleteBuffer(vertexBuffer); + } +} \ No newline at end of file diff --git a/src/com/engine/render/Buffer.hx b/src/com/engine/render/Buffer.hx index 2821542..e679c0c 100755 --- a/src/com/engine/render/Buffer.hx +++ b/src/com/engine/render/Buffer.hx @@ -1,9 +1,15 @@ package com.engine.render; import com.engine.misc.Util; -import com.engine.misc.MatrixHelp; -import com.engine.math.Matrix; import com.engine.math.Vector2; +import com.engine.game.Game; +import flash.display.DisplayObject; + +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.geom.Point; + + /** * ... * @author djoker @@ -11,34 +17,46 @@ import com.engine.math.Vector2; class Buffer { - public var viewMatrix:Matrix; - public var position:Vector2; + public var viewMatrix:Matrix3D; + public var position:Vector2;//position of the matrix + public var x:Float; + public var y:Float; public var scale:Float; public var rotation:Float; + public var scrollx:Float;///factor of scroll + public var scrolly:Float;///factor of scroll public function new() { position =new Vector2(0, 0); rotation = 0; scale=1; - viewMatrix = Matrix.Identity(); + viewMatrix = new Matrix3D(); + scrollx = 1; + scrolly = 1; + x = 0; + y = 0; + update(); } - public function getMatrix():Matrix + public function getMatrix():Matrix3D { return this.viewMatrix; } - public function combineMatrix(m:Matrix) + public function combineMatrix(m:Matrix3D) { - viewMatrix.Multiply4x4(viewMatrix, m); + viewMatrix.append(m); } public function update() { - viewMatrix.set2Dtransformation( Math.round(position.x), Math.round(position.y), scale, rotation); + viewMatrix.identity(); + viewMatrix.appendScale(scale, scale, 0); + viewMatrix.appendTranslation( Math.round(position.x-Game.camera.scrollX *scrollx), Math.round(position.y-Game.camera.scrollY *scrolly),0); } public function dispose() { - + viewMatrix = null; + position = null; } } \ No newline at end of file diff --git a/src/com/engine/render/Camera.hx b/src/com/engine/render/Camera.hx index 37ead2a..2490171 100755 --- a/src/com/engine/render/Camera.hx +++ b/src/com/engine/render/Camera.hx @@ -1,11 +1,13 @@ package com.engine.render; import com.engine.game.Game; -import com.engine.math.Matrix; -import com.engine.math.Vector3; - +import com.engine.math.Vector2; +import com.engine.misc.Util; +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.geom.Point; @@ -14,19 +16,47 @@ import com.engine.math.Vector3; * ... * @author djoker */ -class Camera buffer +class Camera { + public var projMatrix:Matrix3D; + public var viewMatrix:Matrix3D; + private var width:Float; + private var height:Float; + public var scale:Float; + + public var position:Vector2;//this value move the world matrix + public var scrollX:Float; + public var scrollY:Float; + + - public function new() + public function new(width:Int,height:Int) { - super(); + projMatrix = Util.createOrtho(0, width, height, 0, -1, 1); + this.width = width; + this.height = height; + viewMatrix = new Matrix3D(); + scale = 1; + position = new Vector2(0, 0); + scrollX = 0; + scrollY = 0; } - public function unproject(source:Vector3):Vector3 + public function update() + { + viewMatrix.identity(); + viewMatrix.appendScale(scale, scale, 0); + viewMatrix.appendTranslation(Math.round(position.x),Math.round( position.y), 0); + + + + } + public function resize(width:Float, height:Float) { - var world=Matrix.Identity(); - return Vector3.Unproject(source, Game.viewWidth, Game.viewHeight, world, this.viewMatrix, Game.projMatrix); + this.width = width; + this.height = height; + projMatrix = Util.createOrtho(0, width, height, 0, -1, 1); } diff --git a/src/com/engine/render/PrimitiveShader.hx b/src/com/engine/render/PrimitiveShader.hx index 6d4b14a..3032e8f 100755 --- a/src/com/engine/render/PrimitiveShader.hx +++ b/src/com/engine/render/PrimitiveShader.hx @@ -5,7 +5,10 @@ import openfl.gl.GLBuffer; import openfl.gl.GLProgram; import openfl.utils.Float32Array; -import flash.geom.Matrix3D; +import flash.geom.Matrix; +import flash.geom.Point; + +import com.engine.render.filter.Filter; /** @@ -27,23 +30,9 @@ private var shaderProgram:GLProgram; { -var vertexShaderSource = -" -attribute vec3 aVertexPosition; -attribute vec4 aColor; - -varying vec4 vColor; - -uniform mat4 uModelViewMatrix; -uniform mat4 uProjectionMatrix; -void main(void) -{ -vColor = aColor; -gl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0); -}"; var vertexShader = GL.createShader (GL.VERTEX_SHADER); -GL.shaderSource (vertexShader, vertexShaderSource); +GL.shaderSource (vertexShader, Filter.colorVertexShader); GL.compileShader (vertexShader); if (GL.getShaderParameter (vertexShader, GL.COMPILE_STATUS) == 0) @@ -53,21 +42,9 @@ throw (GL.getShaderInfoLog(vertexShader)); } -var fragmentShaderSource = - -#if !desktop -"precision mediump float;" + -#end -" - -varying vec4 vColor; -void main(void) -{ - gl_FragColor = vColor; -}"; var fragmentShader = GL.createShader (GL.FRAGMENT_SHADER); -GL.shaderSource (fragmentShader, fragmentShaderSource); +GL.shaderSource (fragmentShader, Filter.colorFragmentShader); GL.compileShader (fragmentShader); if (GL.getShaderParameter (fragmentShader, GL.COMPILE_STATUS) == 0) { @@ -107,5 +84,11 @@ modelViewMatrixUniform = GL.getUniformLocation (shaderProgram, "uModelViewMatrix { GL.disableVertexAttribArray (vertexAttribute); GL.disableVertexAttribArray (colorAttribute); + GL.useProgram (null); + } + public function dispose() + { + GL.deleteProgram(shaderProgram); + } } \ No newline at end of file diff --git a/src/com/engine/render/RenderTexture.hx b/src/com/engine/render/RenderTexture.hx new file mode 100755 index 0000000..3322d3b --- /dev/null +++ b/src/com/engine/render/RenderTexture.hx @@ -0,0 +1,73 @@ +package com.engine.render; + +import com.engine.game.Game; + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLFramebuffer; +import openfl.gl.GLRenderbuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.utils.Int16Array; + +/** + * ... + * @author djoker + */ +class RenderTexture extends Texture +{ + private var framebuffer:GLFramebuffer; + // private var renderbuffer:GLRenderbuffer; + + + public function new(width:Int,height:Int) + { + super(); + + this.width = width; + this.height = height; + + this.texWidth = width; + this.texHeight = height; + + invTexWidth = 1.0 / texWidth; + invTexHeight = 1.0 / texHeight; + + framebuffer = GL.createFramebuffer(); + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + + data = GL.createTexture(); + GL.bindTexture(GL.TEXTURE_2D, data); + GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGB, width, height, 0, GL.RGBA, GL.UNSIGNED_INT, null); + + + + + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); + GL.texParameteri(GL.TEXTURE_2D,GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); + + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + GL.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, data, 0); + + + + } + public function begin() + { + GL.colorMask(true, true, true, true); + GL.viewport(0, 0, width, height); + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + GL.clearColor(0, 0, 0, 1); + // GL.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); + GL.clear(GL.COLOR_BUFFER_BIT); + } + public function end() + { + GL.bindFramebuffer(GL.FRAMEBUFFER, null); + } + + + +} \ No newline at end of file diff --git a/src/com/engine/render/SpriteAtlas.hx b/src/com/engine/render/SpriteAtlas.hx index 1061aca..54c499e 100755 --- a/src/com/engine/render/SpriteAtlas.hx +++ b/src/com/engine/render/SpriteAtlas.hx @@ -1,7 +1,8 @@ package com.engine.render; -import flash.geom.Matrix3D; +import flash.geom.Matrix; +import flash.geom.Point; import openfl.display.OpenGLView; import openfl.gl.GL; @@ -13,6 +14,8 @@ import openfl.display.FPS; import com.engine.render.BlendMode; +import com.engine.game.Game; +import com.engine.render.filter.Filter; /** * ... @@ -31,44 +34,24 @@ class SpriteAtlas extends Buffer private var currentBatchSize:Int; private var currentBlendMode:Int; private var currentBaseTexture:Texture; - - - -private var vertexBuffer:GLBuffer; -private var indexBuffer:GLBuffer; - -private var invTexWidth:Float = 0; -private var invTexHeight:Float = 0; - -public var camera:OrthoCamera; - - public var vertexDeclaration:Array; + private var vertexBuffer:GLBuffer; + private var indexBuffer:GLBuffer; + private var invTexWidth:Float = 0; + private var invTexHeight:Float = 0; public var vertexStrideSize:Int; - - - -public var shader:SpriteShader; + public var shader:SpriteShader; public function new(texture:Texture,capacity:Int ) { - - super(); + super(); this.capacity = capacity; - vertexDeclaration = [3, 2,4]; - vertexStrideSize = 9 * 4; // 9 floats (x, y, z,u,v, r, g, b, a) + vertexStrideSize = (3+2+4) *4; // 9 floats (x, y, z,u,v, r, g, b, a) - numVerts = capacity * vertexStrideSize * 4; + numVerts = capacity * vertexStrideSize; numIndices = capacity * 6; + vertices = new Float32Array(numVerts); - - - vertices = new Float32Array(numVerts); - - - - - this.indices = new Int16Array(numIndices); var length = Std.int(this.indices.length/6); @@ -87,7 +70,7 @@ public var shader:SpriteShader; drawing = false; currentBatchSize = 0; - currentBlendMode = BlendMode.SCREEN; + currentBlendMode = BlendMode.NORMAL; this.currentBaseTexture = texture; invTexWidth = 1.0 / texture.texWidth; invTexHeight = 1.0 / texture.texHeight; @@ -103,20 +86,14 @@ public var shader:SpriteShader; GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indices, GL.STATIC_DRAW); GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); - GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.DYNAMIC_DRAW); - - + GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + indices = null; shader = new SpriteShader(); } - public function dispose():Void - { - GL.deleteBuffer(indexBuffer); - GL.deleteBuffer(vertexBuffer); - } - + public function drawImage(img:Image) @@ -311,33 +288,34 @@ vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[in { currentBatchSize = 0; shader.Enable(); - GL.activeTexture(GL.TEXTURE0); - GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); - GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); - GL.vertexAttribPointer(shader.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); - GL.vertexAttribPointer(shader.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); + GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); + GL.vertexAttribPointer(Filter.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); + GL.vertexAttribPointer(Filter.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); + GL.vertexAttribPointer(Filter.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); } public function End() { - if (currentBatchSize==0) return; - currentBaseTexture.Bind(); + if (currentBatchSize==0) return; + shader.setTexture(currentBaseTexture); BlendMode.setBlend(currentBlendMode); - - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(camera.projMatrix.toArray())); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - GL.uniform1i (shader.imageUniform, 0); - GL.bufferSubData(GL.ARRAY_BUFFER, 0, vertices); - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); currentBatchSize = 0; shader.Disable(); } override public function dispose():Void { + GL.deleteBuffer(indexBuffer); + GL.deleteBuffer(vertexBuffer); + super.dispose(); } + } \ No newline at end of file diff --git a/src/com/engine/render/SpriteBatch.hx b/src/com/engine/render/SpriteBatch.hx index c08a850..d3623b3 100755 --- a/src/com/engine/render/SpriteBatch.hx +++ b/src/com/engine/render/SpriteBatch.hx @@ -4,10 +4,14 @@ import com.engine.game.Entity; import com.engine.game.Game; import com.engine.render.BlendMode; import flash.geom.Matrix; + +import flash.geom.Point; + import openfl.gl.GL; import openfl.gl.GLBuffer; import openfl.utils.Float32Array; import openfl.utils.Int16Array; +import com.engine.render.filter.Filter; @@ -32,16 +36,11 @@ class SpriteBatch extends Buffer public var numTex:Int=0; public var numBlend:Int=0; - private var vertexBuffer:GLBuffer; private var indexBuffer:GLBuffer; - private var invTexWidth:Float = 0; private var invTexHeight:Float = 0; - - - public var vertexDeclaration:Array; - public var vertexStrideSize:Int; +private var vertexStrideSize:Int; @@ -51,10 +50,10 @@ public var shader:SpriteShader; { super(); this.capacity = capacity; - vertexStrideSize = 9 * 4; // 9 floats (x, y, z,u,v, r, g, b, a) - numVerts = capacity * vertexStrideSize * 4; + vertexStrideSize = (3+2+4) * 4; // 9 floats (x, y, z,u,v, r, g, b, a) + numVerts = capacity * vertexStrideSize ; numIndices = capacity * 6; - vertices = new Float32Array(numVerts); + vertices = new Float32Array(numVerts); @@ -88,13 +87,9 @@ public var shader:SpriteShader; //upload the index data GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, new Int16Array(indices), GL.STATIC_DRAW); - - + indices = null; GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.DYNAMIC_DRAW); - - - shader = new SpriteShader(); start(); } @@ -346,10 +341,16 @@ this.currentBatchSize++; this.drawEntity(o); } } - public function drawEntity(obj:Entity) + public function drawEntity(obj:Entity,?childs:Bool=false) { + var matrix:Matrix = obj.getLocalToWorldMatrix(); + //matrix.identity(); + +if (obj.image != null) +{ + - if(obj.image!= this.currentBaseTexture || this.currentBatchSize >= this.capacity) + if(obj.image!= this.currentBaseTexture ) { switchTexture(obj.image); } @@ -360,7 +361,7 @@ this.currentBatchSize++; this.setBlendMode(obj.blendMode); } - + var u:Float = obj.clip.x * invTexWidth; var u2:Float = ( obj.clip.x + obj.clip.width) * invTexWidth; @@ -429,7 +430,7 @@ vertices[index+1*9+5] = r;vertices[index+1*9+6] = g;vertices[index+1*9+7] = b;ve vertices[index+2*9+5] = r;vertices[index+2*9+6] = g;vertices[index+2*9+7] = b;vertices[index+2*9+8] = a; vertices[index+3*9+5] = r;vertices[index+3*9+6] = g;vertices[index+3*9+7] = b;vertices[index+3*9+8] = a; -var matrix:Matrix = obj.getLocalToWorldMatrix(); + for (i in 0...4) { @@ -438,13 +439,19 @@ var matrix:Matrix = obj.getLocalToWorldMatrix(); vertices[index + i * 9 + 0] = matrix.a * x + matrix.c * y + matrix.tx; vertices[index + i * 9 + 1] = matrix.d * y + matrix.b * x + matrix.ty; } - - - - - this.currentBatchSize++; + +} + +if(childs == true) +{ + for (i in 0...obj.children.length) + { + var o:Entity = cast obj.children[i]; + this.drawEntity(o); + } +} } @@ -823,6 +830,8 @@ vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[in numTex = 0; numBlend = 0; currentBatchSize = 0; + currentBaseTexture = null; + currentBlendMode = -1; start(); } public function End() @@ -834,11 +843,10 @@ vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[in private function start() { shader.Enable(); - GL.activeTexture(GL.TEXTURE0); GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); - GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); - GL.vertexAttribPointer(shader.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); - GL.vertexAttribPointer(shader.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); + GL.vertexAttribPointer(Filter.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); + GL.vertexAttribPointer(Filter.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); + GL.vertexAttribPointer(Filter.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); if(currentBlendMode != BlendMode.NORMAL) { setBlendMode(currentBlendMode); @@ -849,16 +857,14 @@ private function flush() { if (currentBatchSize == 0) return; this.update(); - currentBaseTexture.Bind(); + shader.setTexture(currentBaseTexture); numTex++; - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(Game.projMatrix.toArray())); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - - GL.uniform1i (shader.imageUniform, 0); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); GL.bufferSubData(GL.ARRAY_BUFFER, 0, vertices); +// GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); -// trace(currentBatchSize); currentBatchSize = 0; } private function switchTexture (texture:Texture) diff --git a/src/com/engine/render/SpriteCloud.hx b/src/com/engine/render/SpriteCloud.hx index f9bc281..00756ec 100755 --- a/src/com/engine/render/SpriteCloud.hx +++ b/src/com/engine/render/SpriteCloud.hx @@ -2,7 +2,8 @@ package com.engine.render; - +import flash.geom.Matrix; +import flash.geom.Point; import openfl.display.OpenGLView; import openfl.gl.GL; @@ -13,8 +14,8 @@ import openfl.utils.Int16Array; import openfl.display.FPS; import com.engine.misc.Util; -import com.engine.math.Matrix; import com.engine.math.Vector2; +import com.engine.render.filter.Filter; import com.engine.game.Game; @@ -28,7 +29,6 @@ class SpriteCloud extends Buffer private var capacity:Int; private var numVerts:Int; private var numIndices:Int; - private var tmpVertices:Float32Array; private var vertices:Float32Array; private var indices:Int16Array; private var lastIndexCount:Int; @@ -40,7 +40,6 @@ class SpriteCloud extends Buffer private var indexBuffer:GLBuffer; private var invTexWidth:Float = 0; private var invTexHeight:Float = 0; - public var vertexDeclaration:Array; public var vertexStrideSize:Int; public var shader:SpriteShader; private var index:Int; @@ -52,60 +51,16 @@ class SpriteCloud extends Buffer public function new(texture:Texture,capacity:Int ) { super(); - this.capacity = capacity; - - - - - vertexDeclaration = [3, 2,4]; - vertexStrideSize = 9 * 4; - - + this.capacity = capacity; + vertexStrideSize = (3 + 2 + 4) * 4 ; + vertexBuffer = GL.createBuffer(); + indexBuffer = GL.createBuffer(); index = 0; - - tmpVertices = new Float32Array(capacity*vertexStrideSize); - - - drawing = false; - currentBatchSize = 0; - currentBlendMode = BlendMode.NORMAL; - this.currentBaseTexture = texture; - invTexWidth = 1.0 / texture.width; - invTexHeight = 1.0 / texture.height; - - - - - vertexBuffer = GL.createBuffer(); - indexBuffer = GL.createBuffer(); - - - shader = new SpriteShader(); - - rebuid = false; - } - - public function build() - { - - numVerts = tmpVertices.length * vertexStrideSize * 4; - numIndices = tmpVertices.length * 6; - - - vertices = new Float32Array(numVerts); - - for ( i in 0...tmpVertices.length ) - { - vertices[i]=tmpVertices[i]; - } - tmpVertices = null; - - + vertices = new Float32Array(capacity * vertexStrideSize); + numIndices = vertices.length * 6; + indices = new Int16Array(numIndices); - this.indices = new Int16Array(numIndices); - var length = Std.int(this.indices.length/6); - - for (i in 0...length) + for (i in 0...numIndices) { var index2 = i * 6; var index3 = i * 4; @@ -122,22 +77,38 @@ class SpriteCloud extends Buffer GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indices, GL.STATIC_DRAW); - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, null); - - GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); - GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); - GL.bindBuffer(GL.ARRAY_BUFFER, null); - rebuid = true; + indices = null; + // GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); + // GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + + + + drawing = false; + currentBatchSize = 0; + currentBlendMode = BlendMode.NORMAL; + this.currentBaseTexture = texture; + invTexWidth = 1.0 / texture.width; + invTexHeight = 1.0 / texture.height; + rebuid = false; + + + + + + shader = new SpriteShader(); + } + + override public function dispose():Void { this.indices = null; this.vertices = null; GL.deleteBuffer(indexBuffer); GL.deleteBuffer(vertexBuffer); - super.dispose(); + super.dispose(); } @@ -250,39 +221,36 @@ a = img.alpha; v2 = tmp; } -tmpVertices[index++] = x1; -tmpVertices[index++] = y1; -tmpVertices[index++] = 0; -tmpVertices[index++] = u;tmpVertices[index++] = v; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x1; +vertices[index++] = y1; +vertices[index++] = 0; +vertices[index++] = u;vertices[index++] = v; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; -tmpVertices[index++] = x2; -tmpVertices[index++] = y2; -tmpVertices[index++] = 0; -tmpVertices[index++] = u;tmpVertices[index++] = v2; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x2; +vertices[index++] = y2; +vertices[index++] = 0; +vertices[index++] = u;vertices[index++] = v2; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; -tmpVertices[index++] = x3; -tmpVertices[index++] = y3; -tmpVertices[index++] = 0; -tmpVertices[index++] = u2;tmpVertices[index++] = v2; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x3; +vertices[index++] = y3; +vertices[index++] = 0; +vertices[index++] = u2;vertices[index++] = v2; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; -tmpVertices[index++] = x4; -tmpVertices[index++] = y4; -tmpVertices[index++] = 0; -tmpVertices[index++] = u2;tmpVertices[index++] = v; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x4; +vertices[index++] = y4; +vertices[index++] = 0; +vertices[index++] = u2;vertices[index++] = v; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; currentBatchSize++; } - public function add() - { - currentBatchSize++; - } + public function addTile(x:Float,y:Float,width:Float,height:Float,clip:Clip,flipx:Bool,flipy:Bool) { var r, g, b, a:Float; @@ -322,29 +290,29 @@ a = 1; v2 = tmp; } -tmpVertices[index++] = x; -tmpVertices[index++] = y; -tmpVertices[index++] = 0; -tmpVertices[index++] = u;tmpVertices[index++] = v; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x; +vertices[index++] = y; +vertices[index++] = 0; +vertices[index++] = u;vertices[index++] = v; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; -tmpVertices[index++] = x; -tmpVertices[index++] = fy2; -tmpVertices[index++] = 0; -tmpVertices[index++] = u;tmpVertices[index++] = v2; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; - -tmpVertices[index++] = fx2; -tmpVertices[index++] = fy2; -tmpVertices[index++] = 0; -tmpVertices[index++] = u2;tmpVertices[index++] = v2; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; - -tmpVertices[index++] = fx2; -tmpVertices[index++] = y; -tmpVertices[index++] = 0; -tmpVertices[index++] = u2;tmpVertices[index++] = v; -tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVertices[index++] = a; +vertices[index++] = x; +vertices[index++] = fy2; +vertices[index++] = 0; +vertices[index++] = u;vertices[index++] = v2; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; + +vertices[index++] = fx2; +vertices[index++] = fy2; +vertices[index++] = 0; +vertices[index++] = u2;vertices[index++] = v2; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; + +vertices[index++] = fx2; +vertices[index++] = y; +vertices[index++] = 0; +vertices[index++] = u2;vertices[index++] = v; +vertices[index++] = r;vertices[index++] = g;vertices[index++] = b;vertices[index++] = a; @@ -355,42 +323,36 @@ tmpVertices[index++] = r;tmpVertices[index++] = g;tmpVertices[index++] = b;tmpVe } - public function addVertex(x:Float, y:Float, u:Float, v:Float) - { - tmpVertices[index++] = x; - tmpVertices[index++] = y; - tmpVertices[index++] = 0; - tmpVertices[index++] = u;tmpVertices[index++] = v; - tmpVertices[index++] = 1;tmpVertices[index++] = 1;tmpVertices[index++] = 1;tmpVertices[index++] = 1; - } + public function build() + { + GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); + GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + vertices = null; + } public function render() { - this.update(); - if (!rebuid) + if (!rebuid) { - rebuid = true; build(); + rebuid = true; return; } - - if (currentBatchSize==0) return; + this.update(); + if (currentBatchSize == 0) return; + shader.Enable(); - // GL.bufferSubData(GL.ARRAY_BUFFER, 0, vertices); - GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); - GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); - GL.vertexAttribPointer(shader.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); - GL.vertexAttribPointer(shader.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); - BlendMode.setBlend(currentBlendMode); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(Game.projMatrix.toArray())); - GL.activeTexture(GL.TEXTURE0); - currentBaseTexture.Bind(); - GL.uniform1i (shader.imageUniform, 0); - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + GL.vertexAttribPointer(Filter.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); + GL.vertexAttribPointer(Filter.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); + GL.vertexAttribPointer(Filter.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + shader.setTexture(currentBaseTexture); + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + BlendMode.setBlend(currentBlendMode); GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); shader.Disable(); } diff --git a/src/com/engine/render/SpriteShader.hx b/src/com/engine/render/SpriteShader.hx index 684aa33..58e8959 100755 --- a/src/com/engine/render/SpriteShader.hx +++ b/src/com/engine/render/SpriteShader.hx @@ -7,6 +7,9 @@ import openfl.utils.Float32Array; import flash.geom.Matrix3D; +import com.engine.render.filter.Filter; +import com.engine.game.Game; + /** * ... * @author djoker @@ -15,12 +18,11 @@ class SpriteShader { private var shaderProgram:GLProgram; - public var vertexAttribute :Int; - public var texCoordAttribute :Int; - public var colorAttribute :Int; + public var projectionMatrixUniform:Dynamic; public var modelViewMatrixUniform:Dynamic; public var imageUniform:Dynamic; + public var invertUniform:Dynamic; @@ -28,30 +30,10 @@ private var shaderProgram:GLProgram; { -var vertexShaderSource = -" -attribute vec3 aVertexPosition; -attribute vec2 aTexCoord; -attribute vec4 aColor; - -varying vec2 vTexCoord; -varying vec4 vColor; - -uniform mat4 uModelViewMatrix; -uniform mat4 uProjectionMatrix; -void main(void) -{ -vTexCoord = aTexCoord; -vColor = aColor; -gl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0); - -}"; - - //gl_Position = vec4(outpos.x, yflip*outpos.y, outpos.z*2.0 - outpos.w, outpos.w); var vertexShader = GL.createShader (GL.VERTEX_SHADER); -GL.shaderSource (vertexShader, vertexShaderSource); +GL.shaderSource (vertexShader, Filter.textureVertexShader); GL.compileShader (vertexShader); if (GL.getShaderParameter (vertexShader, GL.COMPILE_STATUS) == 0) @@ -61,24 +43,8 @@ throw (GL.getShaderInfoLog(vertexShader)); } -var fragmentShaderSource = - -#if !desktop -"precision mediump float;" + -#end -" -varying vec2 vTexCoord; -varying vec4 vColor; -uniform sampler2D uImage0; - -void main(void) -{ - gl_FragColor = texture2D (uImage0, vTexCoord) * vColor; - -}"; - var fragmentShader = GL.createShader (GL.FRAGMENT_SHADER); -GL.shaderSource (fragmentShader, fragmentShaderSource); +GL.shaderSource (fragmentShader, Filter.textureFragmentShader); GL.compileShader (fragmentShader); if (GL.getShaderParameter (fragmentShader, GL.COMPILE_STATUS) == 0) { @@ -98,27 +64,49 @@ if (GL.getProgramParameter (shaderProgram, GL.LINK_STATUS) == 0) { throw "Unable to initialize the shader program."; } -vertexAttribute = GL.getAttribLocation (shaderProgram, "aVertexPosition"); -texCoordAttribute = GL.getAttribLocation (shaderProgram, "aTexCoord"); -colorAttribute = GL.getAttribLocation (shaderProgram, "aColor"); +Filter.vertexAttribute = GL.getAttribLocation (shaderProgram, "aVertexPosition"); +//GL.bindAttribLocation(shaderProgram,Filter.vertexAttribute,"aVertexPosition"); +Filter.texCoordAttribute = GL.getAttribLocation (shaderProgram, "aTexCoord"); +//GL.bindAttribLocation(shaderProgram,Filter.texCoordAttribute,"aTexCoord"); +Filter.colorAttribute = GL.getAttribLocation (shaderProgram, "aColor"); +//GL.bindAttribLocation(shaderProgram,Filter.colorAttribute,"aColor"); projectionMatrixUniform = GL.getUniformLocation (shaderProgram, "uProjectionMatrix"); modelViewMatrixUniform = GL.getUniformLocation (shaderProgram, "uModelViewMatrix"); imageUniform = GL.getUniformLocation (shaderProgram, "uImage0"); +//invertUniform = GL.getUniformLocation (shaderProgram, "invert"); +//GL.uniform1f (invertUniform, 1); + } public function Enable() { GL.useProgram (shaderProgram); - GL.enableVertexAttribArray (vertexAttribute); - GL.enableVertexAttribArray (texCoordAttribute); - GL.enableVertexAttribArray (colorAttribute); + GL.enableVertexAttribArray (Filter.vertexAttribute); + GL.enableVertexAttribArray (Filter.texCoordAttribute); + GL.enableVertexAttribArray (Filter.colorAttribute); } public function Disable() { - GL.disableVertexAttribArray (vertexAttribute); - GL.disableVertexAttribArray (texCoordAttribute); - GL.disableVertexAttribArray (colorAttribute); - //GL.useProgram (null); + GL.disableVertexAttribArray (Filter.vertexAttribute); + GL.disableVertexAttribArray (Filter.texCoordAttribute); + GL.disableVertexAttribArray (Filter.colorAttribute); + GL.useProgram (null); + + } + public function dispose() + { + GL.deleteProgram(shaderProgram); + + } + public function setTexture(tex:Texture) + { + tex.Bind(); + GL.uniform1i (imageUniform, 0); + } + public function setMatrix() + { + GL.uniformMatrix3D(projectionMatrixUniform, false,Game.camera.projMatrix); + GL.uniformMatrix3D(modelViewMatrixUniform, false, Game.camera.viewMatrix); } } \ No newline at end of file diff --git a/src/com/engine/render/Texture.hx b/src/com/engine/render/Texture.hx index fcc5c9c..a3ea01c 100755 --- a/src/com/engine/render/Texture.hx +++ b/src/com/engine/render/Texture.hx @@ -15,7 +15,7 @@ import flash.Lib; import openfl.Assets; import com.engine.misc.Util; -import com.engine.misc.MatrixHelp; + #if neko @@ -32,35 +32,35 @@ import sys.io.FileOutput; class Texture { public var data:GLTexture; - private var bitmapData:BitmapData ; public var width:Int; public var height:Int; public var texHeight:Int; public var texWidth:Int; + public var name:String; + private var exists:Bool; + public var invTexWidth:Float; + public var invTexHeight:Float; public function Bind() { + if (!exists) return; GL.bindTexture(GL.TEXTURE_2D, data); } - public function new(url:String,?flip:Bool=false ) + public function setData(bitmapData:BitmapData, ?flip:Bool = false,?newname:String="bitmap" ) { - - + exists = false; + if (bitmapData==null) return ; - bitmapData = Assets.getBitmapData(url); + this.name = newname; + if (flip) { - bitmapData = MatrixHelp.flipBitmapData(bitmapData); + bitmapData = Util.flipBitmapData(bitmapData); } - - - data = GL.createTexture (); - GL.bindTexture(GL.TEXTURE_2D, data); + data = GL.createTexture (); + GL.bindTexture(GL.TEXTURE_2D, data); - - - this.width = bitmapData.width; this.height = bitmapData.height; @@ -70,10 +70,7 @@ class Texture var isPot = (bitmapData.width == texWidth && bitmapData.height == texHeight); - - - // trace(bitmapData.width + " x " + bitmapData.height); - // trace(texWidth + " x " + texHeight); + GL.texParameteri (GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); GL.texParameteri (GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); @@ -83,10 +80,8 @@ class Texture if (!isPot) { - //var workingCanvas:BitmapData = MatrixHelp.getScaled(bitmapData, Std.int(texWidth / 2), Std.int(texHeight / 2)); - var workingCanvas:BitmapData = MatrixHelp.getScaled(bitmapData,texWidth, texHeight); - bitmapData = null; - + var workingCanvas:BitmapData = Util.getScaled(bitmapData,texWidth, texHeight); + #if html5 var pixelData = workingCanvas.getPixels(workingCanvas.rect).byteView; #else @@ -94,7 +89,7 @@ class Texture #end GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, workingCanvas.width, workingCanvas.height, 0, GL.RGBA, GL.UNSIGNED_BYTE, pixelData); - trace(workingCanvas.width +"<>"+ workingCanvas.height); + #if neko /* var b:ByteArray = workingCanvas.encode("png"); @@ -103,8 +98,10 @@ class Texture f.close(); */ #end - - + +#if !html5 +//workingCanvas.dispose(); +#end } else { @@ -116,15 +113,104 @@ class Texture #end GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, texWidth, texHeight, 0, GL.RGBA, GL.UNSIGNED_BYTE, pixelData); } + + #if !html5 + // bitmapData.dispose(); + #end + invTexWidth = 1.0 / texWidth; + invTexHeight = 1.0 /texHeight; + exists = true; + } + public function load(url:String, ?flip:Bool = false ) + { + name = url; + var bitmapData:BitmapData ; + bitmapData = Assets.getBitmapData(url); + if (bitmapData==null) return ; + + if (flip) + { + bitmapData = Util.flipBitmapData(bitmapData); + } + data = GL.createTexture (); + GL.bindTexture(GL.TEXTURE_2D, data); + + this.width = bitmapData.width; + this.height = bitmapData.height; + + this.texWidth = Util.getNextPowerOfTwo(width); + this.texHeight = Util.getNextPowerOfTwo(height); + + var isPot = (bitmapData.width == texWidth && bitmapData.height == texHeight); + + + GL.texParameteri (GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); + GL.texParameteri (GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); - - + if (!isPot) + { + var workingCanvas:BitmapData = Util.getScaled(bitmapData,texWidth, texHeight); + #if html5 + var pixelData = workingCanvas.getPixels(workingCanvas.rect).byteView; + #else + var pixelData = new UInt8Array(BitmapData.getRGBAPixels(workingCanvas)); + #end + GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, workingCanvas.width, workingCanvas.height, 0, GL.RGBA, GL.UNSIGNED_BYTE, pixelData); + + +#if neko + + var b:ByteArray = workingCanvas.encode("png"); + var f:FileOutput = File.write("rescale.png"); + f.writeString(b.toString()); + f.close(); + +#end + +#if !html5 +//workingCanvas.dispose(); +#end + + + } else + { + + #if html5 + var pixelData = bitmapData.getPixels(bitmapData.rect).byteView; + #else + var pixelData = new UInt8Array(BitmapData.getRGBAPixels(bitmapData)); + #end + GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, texWidth, texHeight, 0, GL.RGBA, GL.UNSIGNED_BYTE, pixelData); + } + + + #if !html5 + // bitmapData.dispose(); + #end + + invTexWidth = 1.0 / texWidth; + invTexHeight = 1.0 /texHeight; + + + exists = true; + + + } + public function new() + { + this.width =0; + this.height = 0; + this.texWidth = 0; + this.texHeight = 0; + exists = false; //GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST_MIPMAP_NEAREST); //GL.generateMipmap(GL.TEXTURE_2D); // GL.bindTexture(GL.TEXTURE_2D, null); @@ -132,5 +218,10 @@ class Texture } + public function dispose() + { + GL.deleteTexture(data); + } + } \ No newline at end of file diff --git a/src/com/engine/render/TileMap.hx b/src/com/engine/render/TileMap.hx index 2e82d03..9f7b09f 100755 --- a/src/com/engine/render/TileMap.hx +++ b/src/com/engine/render/TileMap.hx @@ -5,18 +5,19 @@ import openfl.gl.GLBuffer; import openfl.gl.GLProgram; import openfl.utils.Float32Array; import openfl.utils.Int16Array; -import openfl.display.FPS; -import com.engine.game.Game; + import flash.geom.Point; import openfl.Assets; import com.engine.misc.Util; import com.engine.math.Vector3; -import com.engine.math.Matrix; + import flash.geom.Matrix3D; import flash.geom.Vector3D; - +import com.engine.render.filter.Filter; +import com.engine.game.Game; +import com.engine.render.tiles.Layer; /** * ... @@ -28,60 +29,67 @@ typedef Array2D = Array> class TileMap extends Buffer { + public var currentBlendMode:Int; public var widthInTiles:Int; public var heightInTiles:Int; + public var tileWidth:Int; public var tileHeight:Int; public var margin:Int=0; public var spacing:Int=0; - public var tilesIDs:Array; public var columns:Int; public var image:Texture; - private var isBuild:Bool; - private var capacity:Int; - private var numVerts:Int; - private var numIndices:Int; - private var vertices:Float32Array; - private var indices:Int16Array; - private var lastIndexCount:Int; - private var drawing:Bool; - private var currentBatchSize:Int; - private var currentBlendMode:Int; - private var currentBaseTexture:Texture; + public var ortho:Bool; + -private var vertexBuffer:GLBuffer; -private var indexBuffer:GLBuffer; private var invTexWidth:Float = 0; private var invTexHeight:Float = 0; public var shader:SpriteShader; -public var vertexStrideSize:Int; - + +//layers + +public var layers:Array; + +//blocks + private var blocks:Array; + private var segmentCols:Int ; + private var segmentRows:Int ; + private var numSegments:Int ; + private var segmentWidth:Int; + private var segmentHeight:Int ; -public function new (xml:String):Void + public function new (xml:String,?Build:Bool=true):Void { - super(); + super(); + + var initTime:Int = Util.getTime(); + var xml = Xml.parse(xml).firstElement(); widthInTiles = Std.parseInt(xml.get("width")); heightInTiles = Std.parseInt(xml.get("height")); - //this.orientation = xml.get("orientation"); + if (xml.get("orientation") == "orthogonal") + { + ortho = true; + } else { + ortho = false; + } // tileWidth = Std.parseInt(xml.get("tilewidth")); // tileHeight = Std.parseInt(xml.get("tileheight")); var properties = new Map(); + layers = []; for (child in xml) { - // trace("node:" +child.toString()); - if (isValidElement(child)) + if (isValidElement(child)) { - // trace(child.nodeName); if (child.nodeName == "tileset") { if (child.get("source") != null) @@ -91,10 +99,6 @@ public function new (xml:String):Void { tilesfromGenericXml(child.toString()); } - - //tileset.setFirstGID(Std.parseInt(child.get("firstgid"))); - - //this.tilesets.push(tileset); } else if (child.nodeName == "properties") @@ -115,279 +119,185 @@ public function new (xml:String):Void else if (child.nodeName == "objectgroup") { objectsfromGenericXml(child); - - } } } - addClips(); - - capacity = (this.widthInTiles * this.heightInTiles); - - - vertexStrideSize = 9 * 4; - - numVerts = capacity * vertexStrideSize * 4; - numIndices = capacity * 6; - - - - vertices = new Float32Array(numVerts); - - - - - - this.indices = new Int16Array(numIndices); - var length = Std.int(this.indices.length/6); + var endTime:Int = Util.getTime(); - for (i in 0...length) - { - var index2 = i * 6; - var index3 = i * 4; - this.indices[index2 + 0] = index3 + 0; - this.indices[index2 + 1] = index3 + 1; - this.indices[index2 + 2] = index3 + 2; - this.indices[index2 + 3] = index3 + 0; - this.indices[index2 + 4] = index3 + 2; - this.indices[index2 + 5] = index3 + 3; - }; + if (Build) buildBuffers(); + trace(" tock "+ (endTime-initTime)+" to load tilemap"); + + +} - currentBatchSize = 0; +public function buildBuffers() +{ + shader = new SpriteShader(); currentBlendMode = BlendMode.NORMAL; - invTexWidth = 1.0 / image.texWidth; - invTexHeight = 1.0 / image.texHeight; - + for (l in 0...layers.length) + { + layers[l].build(); + } +} - vertexBuffer = GL.createBuffer(); - indexBuffer = GL.createBuffer(); - + /* +public function buildSegments(segmentWidth:Int,segmentHeight:Int) +{ + +segmentCols = 0; +segmentRows = 0; +numSegments = 0; +this.segmentWidth = segmentWidth; +this.segmentHeight = segmentHeight; - //upload the index data - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); - GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indices, GL.STATIC_DRAW); + - - GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); - GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.DYNAMIC_DRAW); - - - - shader = new SpriteShader(); - isBuild = false; - - - + blocks = new Array(); - } + + var tilesetCols:Int = Math.floor(image.width / tileWidth); + var tilesetRows:Int = Math.floor(image.height / tileHeight); + + var viewWidthInTiles:Int = Std.int(Game.viewWidth/ tileWidth); + var viewHeightInTiles:Int = Std.int(Game.viewHeight/ tileHeight); + + var cols:Int = widthInTiles; + var rows:Int = heightInTiles; - - public function build() - { - for (y in 0...heightInTiles) - { - for (x in 0...widthInTiles) + + segmentWidth = segmentWidth == -1 ? (cols < viewWidthInTiles * 2 ? cols : viewWidthInTiles) : segmentWidth; + segmentHeight = segmentHeight == -1 ? (rows < viewHeightInTiles * 2 ? rows : viewHeightInTiles) : segmentHeight; + segmentCols = Math.ceil(cols / segmentWidth); + segmentRows = Math.ceil(rows / segmentHeight); + + for (y in 0...segmentCols) { - - - var id = getCell(x, y); - if (id >= 1) + for (x in 0...segmentRows) { - //id = 1; - var t:Clip = getClip(id - 1); - var DrawX:Int =Math.round((x * tileWidth)); - var DrawY:Int =Math.round((y * tileHeight)); - var dst:Clip = new Clip(Math.round(DrawX),Math.round( DrawY), tileWidth, tileHeight); - this.addQuad(t,dst); + var sw:Int = x == segmentCols - 1 && cols % segmentWidth != 0 ? cols % segmentWidth : segmentWidth; + var sh:Int = y == segmentRows - 1 && rows % segmentHeight != 0 ? rows % segmentHeight : segmentHeight; + blocks.push(new Block(sw, sh)); + numSegments++; } } - } - isBuild = true; - } + + var uvWidth:Float = 1 / (image.width / tileHeight); + var uvHeight:Float = 1 / (image.height / tileWidth); + + + var tid:Int = 0; + var index:Int=0; -public function addQuad(srcrect:Clip, dstrect:Clip) -{ - -var index:Int = currentBatchSize * vertexStrideSize; - -var widthTex:Int = image.width; -var heightTex:Int = image.height; - - - - -vertices[index++] = dstrect.x; -vertices[index++] = dstrect.y; -vertices[index++] = 0; -vertices[index++] = srcrect.x / widthTex; vertices[index++] = srcrect.y / heightTex; -vertices[index++] = 1;vertices[index++] = 1;vertices[index++] = 1;vertices[index++] = 1; + for (y in 0...rows) + { + for (x in 0...cols) + { -vertices[index++] = (dstrect.x + dstrect.width); -vertices[index++] = dstrect.y; -vertices[index++] = 0; -vertices[index++] = (srcrect.x + srcrect.width) / widthTex;vertices[index++] = srcrect.y / heightTex; -vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; - -vertices[index++] =(dstrect.x + dstrect.width); -vertices[index++] =(dstrect.y + dstrect.height); -vertices[index++] = 0; -vertices[index++] = (srcrect.x + srcrect.width) / widthTex;vertices[index++] = (srcrect.y + srcrect.height) / heightTex; -vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; - -vertices[index++] = dstrect.x; -vertices[index++] = (dstrect.y + dstrect.height); -vertices[index++] = 0; -vertices[index++] = srcrect.x / widthTex; vertices[index++] = (srcrect.y + srcrect.height) / heightTex; -vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; - + var segmentRow:Int = Std.int(y / segmentHeight); + var segmentCol:Int = Std.int(x / segmentWidth); + var segmentOffset:Int = segmentRow * segmentCols + segmentCol; + var segment:Block = blocks[segmentOffset]; + + tid = getCell(x, y); + if (tid == 0) + { + continue; + } + tid -= 1; - - -this.currentBatchSize++; - + + var tx:Int = x * tileWidth; + var ty:Int = y * tileHeight; + var u:Float = (tid % tilesetCols) * uvWidth; + var v:Float = Math.floor(tid / tilesetCols) * uvHeight; + + + + segment.addVertex(tx + Util.EPSILON, ty + Util.EPSILON, u, v); + segment.addVertex(tx + tileWidth, ty + Util.EPSILON, u + uvWidth, v); + segment.addVertex(tx + Util.EPSILON, ty + tileHeight, u, v + uvHeight); + segment.addVertex(tx + tileWidth, ty + tileHeight, u + uvWidth, v + uvHeight); + + segment.indices.push(segment.index + 0); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 3); + + + + segment.index += 4; + + } + } + + shader = new SpriteShader(); + + for (i in 0...blocks.length) + { + blocks[i].build(); + } } -public function render() - { - this.update(); - - - - if (!isBuild) - { - build(); - return; - } - shader.Enable(); - GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); - GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); - GL.vertexAttribPointer(shader.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); - GL.vertexAttribPointer(shader.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); - - if (currentBatchSize == 0) return; - - - - GL.activeTexture(GL.TEXTURE0); - image.Bind(); +public function renderSegments(viewWidth:Int,viewHeight:Int) +{ + update(); + shader.Enable(); + shader.setTexture(image); BlendMode.setBlend(this.currentBlendMode); - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(Game.projMatrix.toArray())); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - - GL.uniform1i (shader.imageUniform, 0); - GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.DYNAMIC_DRAW); - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); - shader.Disable(); - } - - -public function renderDinamic(pointx:Float,pointy:Float) - { - this.update(); - isBuild = false; - currentBatchSize = 0; - shader.Enable(); - GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); - GL.vertexAttribPointer(shader.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); - GL.vertexAttribPointer(shader.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); - GL.vertexAttribPointer(shader.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3 + 2) * 4); - - var tw:Int = Math.ceil(tileWidth), th:Int = Math.ceil(tileHeight); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); - - - // determine start and end tiles to draw (optimization) - var startx = Math.floor( -pointx / tw ), - starty = Math.floor( -pointy / th ), - destx = startx + 1 + Math.ceil(Game.viewWidth / tw ), - desty = starty + 1 + Math.ceil(Game.viewHeight / th ); - - // nothing will render if we're completely off screen - if (startx > widthInTiles || starty > heightInTiles || destx < 0 || desty < 0) - return; - - // clamp values to boundaries - if (startx < 0) startx = 0; - if (destx > widthInTiles) destx = widthInTiles; - if (starty < 0) starty = 0; - if (desty > heightInTiles) desty = heightInTiles; - - var wx:Float, sx:Float = (pointx + startx * tw ) , - wy:Float = (pointy + starty * th ) , - stepx:Float = tw , - stepy:Float = th , - tile:Int = 0; - - // adjust scale to fill gaps - var scx = Math.ceil(stepx) / tileWidth; - var scy = Math.ceil(stepy) / tileHeight; - - for (y in starty...desty) - { - wx = sx; - for (x in startx...destx) + + + + var minXSegment:Int = Math.floor((Game.camera.scrollX- position.x) / tileWidth / segmentWidth); + var maxXSegment:Int = Math.floor((Game.camera.scrollX+ viewWidth - position.x ) / tileWidth / segmentWidth); + + var minYSegment:Int = Math.floor((Game.camera.scrollY-position.y) / tileHeight / segmentHeight); + var maxYSegment:Int = Math.floor((Game.camera.scrollY + viewHeight-position.y) / tileHeight / segmentHeight); + for ( sx in minXSegment...maxXSegment) { - - var id = getCell(x%widthInTiles, y%heightInTiles); - if (id >= 1) + for (sy in minYSegment...maxYSegment) { - var t:Clip = getClip(id - 1); - this.addQuad(t,new Clip(Math.round(wx), Math.round(wy), tileWidth,tileHeight)); - } - wx += stepx; + var si:Int = sy * segmentCols + sx; + if (si < 0 || si >= blocks.length) { + continue; + } + blocks[si].render(); + + } } - wy += stepy; - } + + + + + shader.Disable(); +} + */ + - - if (currentBatchSize == 0) return; - GL.activeTexture(GL.TEXTURE0); - image.Bind(); - BlendMode.setBlend(this.currentBlendMode); - GL.uniformMatrix4fv(shader.projectionMatrixUniform, false,new Float32Array(Game.projMatrix.toArray())); - GL.uniformMatrix4fv(shader.modelViewMatrixUniform, false, new Float32Array(viewMatrix.toArray())); - GL.uniform1i (shader.imageUniform, 0); - GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.DYNAMIC_DRAW); - GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); - currentBatchSize = 0; - shader.Disable(); - } - - public function getCell(x:Int, y:Int):Int - { - return tilesIDs[y * this.widthInTiles + x]; - - } + public function getClip(num:Int):Clip { - - - // return new Clip(this.tileWidth * (num % columns), this.tileHeight * Std.int(num / columns), this.tileWidth, this.tileHeight); return new Clip( this.margin + (this.tileWidth + this.spacing) * num % columns, this.margin + (this.tileHeight + this.spacing) * Std.int(num / columns), this.tileWidth, this.tileHeight); - - - - } - public function addClips() - { - /* +/* } clips = []; var columns:Int =Std.int( image.width / this.tileWidth ); @@ -411,7 +321,7 @@ public function renderDinamic(pointx:Float,pointy:Float) } } */ - } + public function loadFromString(str:String, columnSep:String = ",", rowSep:String = "\n") { @@ -570,10 +480,13 @@ public function renderDinamic(pointx:Float,pointy:Float) if (child.nodeName == "image") { + var width = Std.parseInt(child.get("width")); var height = Std.parseInt(child.get("height")); // trace("Tile set: Image: " + child.get("source")); - this.image = new Texture("assets/" + child.get("source")); + + this.image =new Texture(); + this.image.load("assets/" + child.get("source")); if (image!=null) { this.columns = Std.int(image.width / this.tileWidth); @@ -581,7 +494,7 @@ public function renderDinamic(pointx:Float,pointy:Float) //trace("Columns:" + columns); } - //image = new TilesetImage(child.get("source"), width, height); + } if (child.nodeName == "terraintypes") @@ -663,15 +576,21 @@ public function renderDinamic(pointx:Float,pointy:Float) public function layerfromGenericXml(xml:Xml) { + + + var name:String = xml.get("name"); var width:Int = Std.parseInt(xml.get("width")); var height:Int = Std.parseInt(xml.get("height")); var opacity:Float = Std.parseFloat(xml.get("opacity") != null ? xml.get("opacity") : "1.0"); - tilesIDs= new Array(); + var layer:Layer = new Layer(width, height, tileWidth, tileHeight, opacity, name); + layer.parent = this; + for (child in xml) { + if (isValidElement(child)) { if (child.nodeName == "data") @@ -691,18 +610,16 @@ public function renderDinamic(pointx:Float,pointy:Float) case "csv": { chunk = child.firstChild().nodeValue; - //trace("csv"); - tilesIDs = csvToArray(chunk); + layer.tilesIDs= csvToArray(chunk); } default: { - //trace("string tiles"); for (tile in child) { if (isValidElement(tile)) { var gid = Std.parseInt(tile.get("gid")); - tilesIDs.push(gid); + layer.tilesIDs.push(gid); } } } @@ -710,48 +627,48 @@ public function renderDinamic(pointx:Float,pointy:Float) } } } + + layers.push(layer); } - public function toCSV(?width:Int):String - { - if (width <= 0 || width == null) - { - width = this.widthInTiles; - } - - var counter:Int = 0; - var csv:String = ""; - - for (tile in tilesIDs) - { - var tileGID = tile; - - if (counter >= width) - { - // remove the last "," - csv = csv.substr(0, csv.length - 1); - - // add a new line and reset counter - csv += '\n'; - counter = 0; - } - - csv += tileGID; - csv += ','; - - counter++; - } + +public function renderLayer(layer:Int) +{ + this.update(); + if (layer >= layers.length) layer = layers.length; + shader.Enable(); + shader.setTexture(image); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + BlendMode.setBlend(currentBlendMode); + layers[layer].render(); +} - // remove the last "," - csv = csv.substr(0, csv.length - 1); +public function render() +{ + this.update(); + + shader.Enable(); + shader.setTexture(image); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + BlendMode.setBlend(currentBlendMode); + + for (l in 0...layers.length) + { + layers[l].render(); + } - return csv; - } +} override public function dispose():Void { - GL.deleteBuffer(indexBuffer); - GL.deleteBuffer(vertexBuffer); - super.dispose(); + for (l in 0...layers.length) + { + layers[l].dispose(); + } + layers = null; + shader.dispose(); + super.dispose(); } } \ No newline at end of file diff --git a/src/com/engine/render/TileMapCache.hx b/src/com/engine/render/TileMapCache.hx new file mode 100755 index 0000000..04fa7ea --- /dev/null +++ b/src/com/engine/render/TileMapCache.hx @@ -0,0 +1,532 @@ +package com.engine.render; + +import flash.geom.Rectangle; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + +import flash.geom.Point; +import openfl.Assets; + +import com.engine.misc.Util; +import com.engine.math.Vector3; + + +import flash.geom.Matrix3D; +import flash.geom.Vector3D; +import com.engine.render.filter.Filter; +import com.engine.game.Game; +import com.engine.render.tiles.LayerCache; + +/** + * ... + * @author djoker + */ +class TileMapCache extends Buffer +{ + + public var currentBlendMode:Int; + + public var widthInTiles:Int; + public var heightInTiles:Int; + + public var tileWidth:Int; + public var tileHeight:Int; + public var margin:Int=0; + public var spacing:Int=0; + public var columns:Int; + public var image:Texture; + public var ortho:Bool; + public var viewBound:Rectangle; + + + + +private var invTexWidth:Float = 0; +private var invTexHeight:Float = 0; + +public var shader:SpriteShader; + + +//layers + +public var layers:Array; + +//blocks + + private var segmentWidth:Int; + private var segmentHeight:Int ; + + +public function renderLayer(layer:Int) +{ + update(); + if (layer >= layers.length) layer = layers.length; + shader.Enable(); + shader.setTexture(image); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + BlendMode.setBlend(currentBlendMode); + layers[layer].renderSegments(); +} + +public function render() +{ + this.update(); + shader.Enable(); + shader.setTexture(image); + GL.uniformMatrix3D(shader.modelViewMatrixUniform, false, viewMatrix); + GL.uniformMatrix3D(shader.projectionMatrixUniform, false,Game.camera.projMatrix); + BlendMode.setBlend(currentBlendMode); + for (l in 0...layers.length) + { + layers[l].renderSegments(); + } + + shader.Disable(); +} + +public function renderAABB(batch:BatchPrimitives) +{ + + for (l in 0...layers.length) + { + layers[l].renderAABB(batch); + } + + batch.rect(viewBound.left, viewBound.top, viewBound.right, viewBound.bottom,1,1,0,1); + +} + + + public function new (xml:String,segmentWidth:Int,segmentHeight:Int):Void + { + super(); + this.segmentWidth = segmentWidth; + this.segmentHeight = segmentHeight; + + var initTime:Int = Util.getTime(); + + var xml = Xml.parse(xml).firstElement(); + + widthInTiles = Std.parseInt(xml.get("width")); + heightInTiles = Std.parseInt(xml.get("height")); + if (xml.get("orientation") == "orthogonal") + { + ortho = true; + } else { + ortho = false; + } + // tileWidth = Std.parseInt(xml.get("tilewidth")); + // tileHeight = Std.parseInt(xml.get("tileheight")); + var properties = new Map(); + layers = []; + + for (child in xml) + { + if (isValidElement(child)) + { + if (child.nodeName == "tileset") + { + if (child.get("source") != null) + { + tilesfromGenericXml(getText(child.get("source"))); + } else + { + tilesfromGenericXml(child.toString()); + } + } + + else if (child.nodeName == "properties") + { + for (property in child) + { + if (!isValidElement(property)) + continue; + // properties.set(property.get("name"), property.get("value")); + } + } + + else if (child.nodeName == "layer") + { + layerfromGenericXml(child); + } + + else if (child.nodeName == "objectgroup") + { + objectsfromGenericXml(child); + } + } + } + + var endTime:Int = Util.getTime(); + + viewBound = new Rectangle(0, 0, Game.viewWidth, Game.viewHeight); + + + buildBuffers(); + + trace(" tock "+ (endTime-initTime)+" to load tilemap"); + + + +} + +public function setViewPort(x:Float, y:Float, width:Float, height:Float) +{ + viewBound = new Rectangle(x, y, width, height); + +} + +public function buildBuffers() +{ + shader = new SpriteShader(); + currentBlendMode = BlendMode.NORMAL; + + for (l in 0...layers.length) + { + layers[l].buildSegments(segmentWidth, segmentHeight); + } +} + + + + + + + public function getClip(num:Int):Clip + { + // return new Clip(this.tileWidth * (num % columns), this.tileHeight * Std.int(num / columns), this.tileWidth, this.tileHeight); + return new Clip( + this.margin + (this.tileWidth + this.spacing) * num % columns, + this.margin + (this.tileHeight + this.spacing) * Std.int(num / columns), + this.tileWidth, this.tileHeight); + } + + + + + public function loadFromString(str:String, columnSep:String = ",", rowSep:String = "\n") + { + var row:Array = str.split(rowSep), + rows:Int = row.length, + col:Array, cols:Int, x:Int, y:Int; + for (y in 0...rows) + { + if (row[y] == '') continue; + col = row[y].split(columnSep); + cols = col.length; + for (x in 0...cols) + { + if (col[x] == '') continue; + //_map[y][x] = Std.parseInt(col[x]); + } + } + } + + + public function objectfromGenericXml(xml:Xml) + { + var gid:Int = xml.get("gid") != null ? Std.parseInt(xml.get("gid")) : 0; + var name:String = xml.get("name"); + var type:String = xml.get("type"); + var x:Int = Std.parseInt(xml.get("x")); + var y:Int = Std.parseInt(xml.get("y")); + var width:Int = Std.parseInt(xml.get("width")); + var height:Int = Std.parseInt(xml.get("height")); + //var polygon:TiledPolygon = null; + //var polyline:TiledPolyline = null; + var properties:Map = new Map(); + + for (child in xml) + { + if (isValidElement(child)) + { + if (child.nodeName == "properties") + { + for (property in child) + { + if (isValidElement(property)) + { + properties.set(property.get("name"), property.get("value")); + } + } + } + + if (child.nodeName == "polygon" || child.nodeName == "polyline") + { + var origin:Point = new Point(x, y); + var points:Array = new Array(); + + var pointsAsString:String = child.get("points"); + + var pointsAsStringArray:Array = pointsAsString.split(" "); + + for (p in pointsAsStringArray) + { + //var coords:Array = p.split(","); + //points.push(new Point(Std.parseInt(coords[0]), Std.parseInt(coords[1]))); + } + + if (child.nodeName == "polygon") + { + //polygon = new TiledPolygon(origin, points); + } else if (child.nodeName == "polyline") + { + // polyline = new TiledPolyline(origin, points); + } + } + } + } + + + } + public function objectsfromGenericXml(xml:Xml) + { + var name = xml.get("name"); + var color = xml.get("color"); + var width = Std.parseInt(xml.get("width")); + var height = Std.parseInt(xml.get("height")); + var properties:Map = new Map(); + //var objects:Array = new Array(); + + for (child in xml) { + if (isValidElement(child)) + { + if (child.nodeName == "properties") { + for (property in child) { + if (isValidElement(property)) + { + properties.set(property.get("name"), property.get("value")); + } + } + } + + if (child.nodeName == "object") + { + objectfromGenericXml(child); + } + } + } + + + } + + + public function isValidElement(element:Xml):Bool + { + return Std.string(element.nodeType) == "element"; + } + public function getText(assetPath:String):String + { + return Assets.getText(assetPath); + } + + public function tilesfromGenericXml(content:String) + { + var xml = Xml.parse(content).firstElement(); + + var name:String = xml.get("name"); + tileWidth = Std.parseInt(xml.get("tilewidth")); + tileHeight = Std.parseInt(xml.get("tileheight")); + spacing = xml.exists("spacing") ? Std.parseInt(xml.get("spacing")) : 0; + margin = xml.exists("margin") ? Std.parseInt(xml.get("margin")) : 0; + + var properties:Map = new Map(); + //var propertyTiles:Map = new Map(); + //var terrainTypes:Array = new Array(); + //var image:TilesetImage = null; + + var tileOffsetX:Int = 0; + var tileOffsetY:Int = 0; + + for (child in xml.elements()) + { + if (isValidElement(child)) + { + if (child.nodeName == "properties") + { + for (property in child) { + if (isValidElement(property)) + { + trace("tileHeight set name:" + property.get("name") +" - Value : " + property.get("value")); + // properties.set(property.get("name"), property.get("value")); + } + } + } + + if (child.nodeName == "tileoffset") + { + tileOffsetX = Std.parseInt(child.get("x")); + tileOffsetY = Std.parseInt(child.get("y")); + } + + if (child.nodeName == "image") + { + + var width = Std.parseInt(child.get("width")); + var height = Std.parseInt(child.get("height")); + // trace("Tile set: Image: " + child.get("source")); + + this.image =new Texture(); + this.image.load("assets/" + child.get("source")); + if (image!=null) + { + this.columns = Std.int(image.width / this.tileWidth); + + + //trace("Columns:" + columns); + } + + } + + if (child.nodeName == "terraintypes") + { + for (element in child) + { + + if (isValidElement(element)) + { + if (element.nodeName == "terrain") + { + // terrainTypes.push(new TerrainType(element.get("name"), Std.parseInt(element.get("tile")))); + } + } + } + } + + + if (child.nodeName == "tile") + { + //trace("tile"); + var id:Int = Std.parseInt(child.get("id")); + var properties:Map = new Map(); + + for (element in child) + { + + if (isValidElement(element)) + { + if (element.nodeName == "properties") + { + for (property in element) { + if (!isValidElement(property)) { + continue; + } + + //properties.set(property.get("name"), property.get("value")); + } + } + } + } + + //propertyTiles.set(id, new PropertyTile(id, properties)); + } + } + } + + //return new Tileset(name, tileWidth, tileHeight, spacing, properties, terrainTypes, image, + //new Point(tileOffsetX, tileOffsetY)); + } + + + private function csvToArray(input:String):Array + { + var result:Array = new Array(); + var rows:Array = StringTools.trim(input).split("\n"); + var row:String; + + for (row in rows) { + + if (row == "") { + continue; + } + + var resultRow:Array = new Array(); + var entries:Array = row.split(","); + var entry:String; + + for (entry in entries) { + + if(entry != "") { + result.push(Std.parseInt(entry)); + } + } + } + return result; + } + + + public function layerfromGenericXml(xml:Xml) + { + + + + var name:String = xml.get("name"); + var width:Int = Std.parseInt(xml.get("width")); + var height:Int = Std.parseInt(xml.get("height")); + var opacity:Float = Std.parseFloat(xml.get("opacity") != null ? xml.get("opacity") : "1.0"); + + var layer:LayerCache = new LayerCache(width, height, tileWidth, tileHeight, opacity, name); + layer.parent = this; + + + for (child in xml) + { + + if (isValidElement(child)) + { + if (child.nodeName == "data") + { + var encoding:String = ""; + if (child.exists("encoding")) + { + encoding = child.get("encoding"); + } + var chunk:String = ""; + switch(encoding){ + case "base64": + { + chunk = child.firstChild().nodeValue; + //trace("base64"); + } + case "csv": + { + chunk = child.firstChild().nodeValue; + layer.tilesIDs= csvToArray(chunk); + } + default: + { + for (tile in child) + { + if (isValidElement(tile)) + { + var gid = Std.parseInt(tile.get("gid")); + layer.tilesIDs.push(gid); + } + } + } + } + } + } + } + + layers.push(layer); + } + + + +override public function dispose():Void +{ + for (l in 0...layers.length) + { + layers[l].dispose(); + } + layers = null; + shader.dispose(); + super.dispose(); + +} +} \ No newline at end of file diff --git a/src/com/engine/render/VertexBuffer.hx b/src/com/engine/render/VertexBuffer.hx index da58c53..75ad721 100755 --- a/src/com/engine/render/VertexBuffer.hx +++ b/src/com/engine/render/VertexBuffer.hx @@ -1,6 +1,7 @@ package com.engine.render; -import flash.geom.Matrix3D; +import flash.geom.Matrix; +import flash.geom.Point; import openfl.display.OpenGLView; import openfl.gl.GL; @@ -13,7 +14,7 @@ import openfl.utils.UInt8Array; import openfl.utils.Int16Array; import openfl.display.FPS; -import com.engine.math.Matrix; +import flash.geom.Matrix; import com.engine.render.BlendMode; /** diff --git a/src/com/engine/render/filter/BlurFilter.hx b/src/com/engine/render/filter/BlurFilter.hx new file mode 100755 index 0000000..39d67ad --- /dev/null +++ b/src/com/engine/render/filter/BlurFilter.hx @@ -0,0 +1,37 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class BlurFilter extends RenderFilter +{ +private var blur:Float = 1/512; + private var blurUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.blurXFilter; + } + override public function getUnifom() + { + blurUniform = GL.getUniformLocation (shader, "blur"); + } + override public function setUnifom() + { + GL.uniform1f (blurUniform, blur); + } + public function setBlur(v:Float) + { + blur = v / (1 / 7000); + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/BlurXFilter.hx b/src/com/engine/render/filter/BlurXFilter.hx new file mode 100755 index 0000000..e95db5a --- /dev/null +++ b/src/com/engine/render/filter/BlurXFilter.hx @@ -0,0 +1,37 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class BlurXFilter extends RenderFilter +{ +private var blur:Float = 1/512; + private var blurUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.blurXFilter; + } + override public function getUnifom() + { + blurUniform = GL.getUniformLocation (shader, "blur"); + } + override public function setUnifom() + { + GL.uniform1f (blurUniform, blur); + } + public function setBlur(v:Float) + { + blur = v / (1 / 7000); + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/BlurYFilter.hx b/src/com/engine/render/filter/BlurYFilter.hx new file mode 100755 index 0000000..95288d8 --- /dev/null +++ b/src/com/engine/render/filter/BlurYFilter.hx @@ -0,0 +1,37 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class BlurYFilter extends RenderFilter +{ +private var blur:Float = 1/512; + private var blurUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.blurYFilter; + } + override public function getUnifom() + { + blurUniform = GL.getUniformLocation (shader, "blur"); + } + override public function setUnifom() + { + GL.uniform1f (blurUniform, blur); + } + public function setBlur(v:Float) + { + blur = v / (1 / 7000); + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/ColorMatrixFilter.hx b/src/com/engine/render/filter/ColorMatrixFilter.hx new file mode 100755 index 0000000..06072e8 --- /dev/null +++ b/src/com/engine/render/filter/ColorMatrixFilter.hx @@ -0,0 +1,51 @@ +package com.engine.render.filter; + + +import flash.geom.Matrix; +import flash.geom.Matrix3D; +import flash.geom.Vector3D; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class ColorMatrixFilter extends RenderFilter +{ +private var matrix:Matrix3D; +private var matrixUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.colormatrixFilter; + } + override public function getUnifom() + { + matrix = new Matrix3D([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); + matrixUniform = GL.getUniformLocation (shader, "matrix"); + } + override public function setUnifom() + { + GL.uniformMatrix3D(matrixUniform, false,matrix); + } + public function setTransformation(x:Float,y:Float,rotation:Float,Scale:Float) + { + matrix.identity(); + matrix.appendTranslation(x, y, 0); + matrix.appendRotation(rotation, new Vector3D(0, 0, 1)); + matrix.appendScale(Scale, Scale, 0); + } + + public function setMatrix2D(mat:Matrix) + { + + } + + + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/ColorStepFilter.hx b/src/com/engine/render/filter/ColorStepFilter.hx new file mode 100755 index 0000000..be2fcad --- /dev/null +++ b/src/com/engine/render/filter/ColorStepFilter.hx @@ -0,0 +1,39 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class ColorStepFilter extends RenderFilter +{ +private var step:Float = 5; + private var stepUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.colorStepFilter; + } + override public function getUnifom() + { + stepUniform = GL.getUniformLocation (shader, "step"); + } + override public function setUnifom() + { + GL.uniform1f (stepUniform, step); + } + + public function setStep(f:Float) + { + step = f; + + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/CrossHatchFilter.hx b/src/com/engine/render/filter/CrossHatchFilter.hx new file mode 100755 index 0000000..d870173 --- /dev/null +++ b/src/com/engine/render/filter/CrossHatchFilter.hx @@ -0,0 +1,38 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class CrossHatchFilter extends RenderFilter +{ +private var blur:Float = 1/512; + private var blurUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.croshatchFilter; + } + override public function getUnifom() + { + blurUniform = GL.getUniformLocation (shader, "blur"); + } + override public function setUnifom() + { + GL.uniform1f (blurUniform, blur); + } + public function setBlur(v:Float) + { + blur = v;// / (1 / 7000); + trace(blur); + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/DotScreenFilter.hx b/src/com/engine/render/filter/DotScreenFilter.hx new file mode 100755 index 0000000..d9b6958 --- /dev/null +++ b/src/com/engine/render/filter/DotScreenFilter.hx @@ -0,0 +1,49 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; +import openfl.utils.Float32Array; + +/** + * ... + * @author djoker + */ +class DotScreenFilter extends RenderFilter +{ +private var scale:Float = 1; +private var angle:Float = 5; + +private var scaleUniform:GLUniformLocation; +private var angleUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.dotscreenFilter; + } + override public function getUnifom() + { + angleUniform = GL.getUniformLocation (shader, "angle"); + scaleUniform = GL.getUniformLocation (shader, "scale"); + } + override public function setUnifom() + { + GL.uniform1f (scaleUniform,scale); + GL.uniform1f (angleUniform,angle); + } + + public function setScale(v:Float) + { + scale = v; + } + + public function setAngle(v:Float) + { + angle = v; + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/Filter.hx b/src/com/engine/render/filter/Filter.hx new file mode 100755 index 0000000..c00cb5a --- /dev/null +++ b/src/com/engine/render/filter/Filter.hx @@ -0,0 +1,402 @@ +package com.engine.render.filter; + +/** + * ... + * @author djoker + */ +class Filter +{ + static public var vertexAttribute :Int=0; + static public var texCoordAttribute :Int=1; + static public var colorAttribute :Int = 2; + + +static public var colorVertexShader= +" +attribute vec3 aVertexPosition; +attribute vec4 aColor; + +varying vec4 vColor; + +uniform mat4 uModelViewMatrix; +uniform mat4 uProjectionMatrix; +void main(void) +{ +vColor = aColor; +gl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0); +}"; + + +static public var colorFragmentShader= + +#if !desktop +"precision mediump float;" + +#end +" + +varying vec4 vColor; +void main(void) +{ + gl_FragColor = vColor; +}"; + +static public var textureVertexShader= +" +attribute vec3 aVertexPosition; +attribute vec2 aTexCoord; +attribute vec4 aColor; + +varying vec2 vTexCoord; +varying vec4 vColor; + +uniform mat4 uModelViewMatrix; +uniform mat4 uProjectionMatrix; +void main(void) +{ +vTexCoord = aTexCoord; +vColor = aColor; +gl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0); + +}"; + + + +static public var textureFragmentShader= + +#if !desktop +"precision mediump float;" + +#end +" +varying vec2 vTexCoord; +varying vec4 vColor; +uniform sampler2D uImage0; + +void main(void) +{ + gl_FragColor = texture2D (uImage0, vTexCoord) * vColor; + +}"; + +static public var normalFilter = + + #if !desktop + "precision mediump float;" + + #end + "varying vec2 vTexCoord; + uniform sampler2D uImage0; + void main(void) + { + gl_FragColor = texture2D (uImage0, vTexCoord); + }"; + +static public var grayFilter = + #if !desktop +"precision mediump float;" + +#end +" + varying vec2 vTexCoord; + varying vec4 vColor; + uniform sampler2D uImage0; + uniform float gray; + + void main(void) + { + gl_FragColor = texture2D(uImage0, vTexCoord); + gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray); + }"; + + +static public var colorStepFilter = + #if !desktop +"precision mediump float;" + +#end +" varying vec2 vTexCoord; + varying vec4 vColor; + uniform sampler2D uImage0; + uniform float step; + + void main(void) + { + vec4 color = texture2D(uImage0, vTexCoord); + color = floor(color * step) / step; + gl_FragColor = color; + };"; + + +static public var invertFilter = + #if !desktop +"precision mediump float;" + +#end + " varying vec2 vTexCoord; + varying vec4 vColor; + uniform float invert; + uniform sampler2D uImage0; + + void main(void) { + gl_FragColor = texture2D(uImage0, vTexCoord); + gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert); + }"; + +static public var blurYFilter = + #if !desktop +"precision mediump float;" + +#end + " varying vec2 vTexCoord; + varying vec4 vColor; + uniform float blur; + uniform sampler2D uImage0; + + void main(void) { + vec4 sum = vec4(0.0); + + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 4.0*blur)) * 0.05; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 3.0*blur)) * 0.09; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - 2.0*blur)) * 0.12; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y - blur)) * 0.15; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y)) * 0.16; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + blur)) * 0.15; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 2.0*blur)) * 0.12; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 3.0*blur)) * 0.09; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y + 4.0*blur)) * 0.05; + + gl_FragColor = sum; + }"; + + + +static public var blurXFilter = + #if !desktop +"precision mediump float;" + +#end + " varying vec2 vTexCoord; + varying vec4 vColor; + uniform float blur; + uniform sampler2D uImage0; + + void main(void) { + vec4 sum = vec4(0.0); + + sum += texture2D(uImage0, vec2(vTexCoord.x - 4.0*blur, vTexCoord.y)) * 0.05; + sum += texture2D(uImage0, vec2(vTexCoord.x - 3.0*blur, vTexCoord.y)) * 0.09; + sum += texture2D(uImage0, vec2(vTexCoord.x - 2.0*blur, vTexCoord.y)) * 0.12; + sum += texture2D(uImage0, vec2(vTexCoord.x - blur, vTexCoord.y)) * 0.15; + sum += texture2D(uImage0, vec2(vTexCoord.x, vTexCoord.y)) * 0.16; + sum += texture2D(uImage0, vec2(vTexCoord.x + blur, vTexCoord.y)) * 0.15; + sum += texture2D(uImage0, vec2(vTexCoord.x + 2.0*blur, vTexCoord.y)) * 0.12; + sum += texture2D(uImage0, vec2(vTexCoord.x + 3.0*blur, vTexCoord.y)) * 0.09; + sum += texture2D(uImage0, vec2(vTexCoord.x + 4.0*blur, vTexCoord.y)) * 0.05; + + gl_FragColor = sum; + }"; +static public var twistFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform vec4 dimensions; + uniform sampler2D uImage0; + + uniform float radius; + uniform float angle; + uniform vec2 offset; + + void main(void) { + vec2 coord = vTexCoord - offset; + float distance = length(coord); + + if (distance < radius) { + float ratio = (radius - distance) / radius; + float angleMod = ratio * ratio * angle; + float s = sin(angleMod); + float c = cos(angleMod); + coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c); + } + + gl_FragColor = texture2D(uImage0, coord+offset); + }"; + + +static public var sepiaFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform float sepia; + uniform sampler2D uImage0; + + const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912); + + void main(void) { + gl_FragColor = texture2D(uImage0, vTexCoord); + gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia); + }"; + + +static public var blurFilter = + #if !desktop +"precision mediump float;" + +#end + " + precision mediump float; + varying vec2 vTexCoord; + uniform sampler2D uImage0; + //'uniform vec2 delta;', + const vec2 delta = vec2(1.0/10.0, 0.0); + //'uniform float darkness;', + + float random(vec3 scale, float seed) { + return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed); + } + + + void main(void) { + vec4 color = vec4(0.0); + float total = 0.0; + + float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0); + + for (float t = -30.0; t <= 30.0; t++) + { + float percent = (t + offset - 0.5) / 30.0; + float weight = 1.0 - abs(percent); + vec4 sample = texture2D(uImage0, vTexCoord + delta * percent); + sample.rgb *= sample.a; + color += sample * weight; + total += weight; + } + + gl_FragColor = color / total; + gl_FragColor.rgb /= gl_FragColor.a + 0.00001; + //' gl_FragColor.rgb *= darkness;', + }"; + + +static public var pixelateFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform vec2 pixelSize; + uniform sampler2D uImage0; + + void main(void) + { + vec4 dimensions = vec4(10000, 100, 10, 10); + vec2 size = dimensions.xy/pixelSize; + vec2 color = floor( ( vTexCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5; + gl_FragColor = texture2D(uImage0, color); + }"; + +static public var dotscreenFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform sampler2D uImage0; + uniform float angle; + uniform float scale; + + + float pattern() + { + vec4 dimensions = vec4(0,0,0,0); + float s = sin(angle), c = cos(angle); + vec2 tex = vTexCoord * dimensions.xy; + vec2 point = vec2( + c * tex.x - s * tex.y, + s * tex.x + c * tex.y + ) * scale; + return (sin(point.x) * sin(point.y)) * 4.0; + } + + void main() { + vec4 color = texture2D(uImage0, vTexCoord); + float average = (color.r + color.g + color.b) / 3.0; + gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a); + }"; + + +static public var rgbsplitFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform float distance; + uniform vec2 red; + uniform vec2 green; + uniform vec2 blue; + uniform vec4 dimensions; + uniform sampler2D uImage0; + + void main(void) + { + gl_FragColor.r = texture2D(uImage0, vTexCoord + red/distance).r; + gl_FragColor.g = texture2D(uImage0, vTexCoord + green/distance).g; + gl_FragColor.b = texture2D(uImage0, vTexCoord + blue/distance).b; + gl_FragColor.a = texture2D(uImage0, vTexCoord).a; + }"; + +static public var croshatchFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform float blur; + uniform sampler2D uImage0; + + void main(void) { + float lum = length(texture2D(uImage0, vTexCoord.xy).rgb); + + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + + if (lum < 1.00) { + if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + if (lum < 0.75) { + if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + if (lum < 0.50) { + if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + + if (lum < 0.3) { + if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } + } + }"; + +static public var colormatrixFilter = + #if !desktop +"precision mediump float;" + +#end + " + varying vec2 vTexCoord; + varying vec4 vColor; + uniform mat4 matrix; + uniform sampler2D uImage0; + + void main(void) { + gl_FragColor = texture2D(uImage0, vTexCoord) * matrix; + }"; + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/GrayFilter.hx b/src/com/engine/render/filter/GrayFilter.hx new file mode 100755 index 0000000..48eb9fb --- /dev/null +++ b/src/com/engine/render/filter/GrayFilter.hx @@ -0,0 +1,38 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class GrayFilter extends RenderFilter +{ + + private var gray:Float = 1; + private var grayUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.grayFilter; + } + override public function getUnifom() + { + grayUniform = GL.getUniformLocation (shader, "gray"); + } + override public function setUnifom() + { + GL.uniform1f (grayUniform, gray); + } + public function setGray(f:Float) + { + gray = f; + + } +} \ No newline at end of file diff --git a/src/com/engine/render/filter/InvertFilter.hx b/src/com/engine/render/filter/InvertFilter.hx new file mode 100755 index 0000000..6e44ddf --- /dev/null +++ b/src/com/engine/render/filter/InvertFilter.hx @@ -0,0 +1,39 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class InvertFilter extends RenderFilter +{ + + private var invert:Float = 1; + private var invertUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.invertFilter; + } + override public function getUnifom() + { + invertUniform = GL.getUniformLocation (shader, "invert"); + } + override public function setUnifom() + { + GL.uniform1f (invertUniform, invert); + } + public function setInvert(f:Float) + { + invert = f; + + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/NormalFilter.hx b/src/com/engine/render/filter/NormalFilter.hx new file mode 100755 index 0000000..b3dd422 --- /dev/null +++ b/src/com/engine/render/filter/NormalFilter.hx @@ -0,0 +1,44 @@ +package com.engine.render.filter; + +import com.engine.game.Game; +import com.engine.render.filter.Filter; + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLFramebuffer; +import openfl.gl.GLRenderbuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; + + +//*********************//TEST TEST TEST + +import flash.geom.Matrix3D; +import flash.geom.Rectangle; +import openfl.gl.GLUniformLocation; +import openfl.utils.Float32Array; +import openfl.utils.UInt8Array; +import openfl.utils.UInt8Array; + +/** + * ... + * @author djoker + */ +class NormalFilter extends RenderFilter +{ + + + override public function getFragment():String + { + return Filter.normalFilter; + } + override public function getUnifom() + { + + } + override public function setUnifom() + { + + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/PixelateFilter.hx b/src/com/engine/render/filter/PixelateFilter.hx new file mode 100755 index 0000000..16b4a1b --- /dev/null +++ b/src/com/engine/render/filter/PixelateFilter.hx @@ -0,0 +1,42 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; +import openfl.utils.Float32Array; + +/** + * ... + * @author djoker + */ +class PixelateFilter extends RenderFilter +{ + private var pixelSizeX:Float = 0.9; + private var pixelSizeY:Float = 0.9; + + private var pixelSizeUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.pixelateFilter; + } + override public function getUnifom() + { + pixelSizeUniform = GL.getUniformLocation (shader, "pixelSize"); + } + override public function setUnifom() + { + GL.uniform2f (pixelSizeUniform, pixelSizeX, pixelSizeY); + } + public function setPixelSize(x:Float,y:Float) + { + pixelSizeX = x; + pixelSizeY = y; + + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/RGBSplitFilter.hx b/src/com/engine/render/filter/RGBSplitFilter.hx new file mode 100755 index 0000000..b46db87 --- /dev/null +++ b/src/com/engine/render/filter/RGBSplitFilter.hx @@ -0,0 +1,45 @@ +package com.engine.render.filter; + + +import flash.geom.Point; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class RGBSplitFilter extends RenderFilter +{ + private var colordistance:Float = 10000; + private var redUniform:GLUniformLocation; + private var greenUniform:GLUniformLocation; + private var blueUniform:GLUniformLocation; + private var subtractUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.rgbsplitFilter; + } + override public function getUnifom() + { + redUniform = GL.getUniformLocation (shader, "red"); + greenUniform = GL.getUniformLocation (shader, "green"); + blueUniform = GL.getUniformLocation (shader, "blue"); + subtractUniform= GL.getUniformLocation (shader, "distance"); + + } + override public function setUnifom() + { + GL.uniform1f (subtractUniform,colordistance); + GL.uniform2f (redUniform, 20,20); + GL.uniform2f (greenUniform,-20,20); + GL.uniform2f (blueUniform, 20,-20); + } + + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/RenderFilter.hx b/src/com/engine/render/filter/RenderFilter.hx new file mode 100755 index 0000000..ee4cafa --- /dev/null +++ b/src/com/engine/render/filter/RenderFilter.hx @@ -0,0 +1,212 @@ +package com.engine.render.filter; + +import com.engine.game.Game; +import com.engine.render.filter.Filter; + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLFramebuffer; +import openfl.gl.GLRenderbuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; + + +//*********************//TEST TEST TEST + +import flash.geom.Matrix3D; +import flash.geom.Rectangle; +import openfl.gl.GLUniformLocation; +import openfl.utils.Float32Array; +import openfl.utils.UInt8Array; +import openfl.utils.UInt8Array; + +/** + * ... + * @author djoker + */ +class RenderFilter +{ + + //TESt + private var modelViewMatrixUniform:GLUniformLocation; + private var projectionMatrixUniform:GLUniformLocation; + private var imageUniform:GLUniformLocation; + public var shader:GLProgram; + private var texCoordAttribute:Int; + private var texCoordBuffer:GLBuffer; + private var vertexAttribute:Int; + private var vertexBuffer:GLBuffer; + //end test + private var framebuffer:GLFramebuffer; + private var texture : GLTexture; + public var width:Int; + public var height:Int; + + + public function new(width:Int,height:Int) + { + + + this.width = width; + this.height = height; + + framebuffer = GL.createFramebuffer(); + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + + texture = GL.createTexture(); + GL.bindTexture(GL.TEXTURE_2D, texture); + + + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); + GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); + + //#if html5 + // var pixelData = new UInt8Array(width * height *4); + GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, width, height, 0, GL.RGBA, GL.UNSIGNED_BYTE, null); + // pixelData = null; + // #else + // GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, width, height, 0, GL.RGBA, GL.UNSIGNED_BYTE, null); + // #end + // + + + + + + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + GL.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, texture, 0); + GL.bindFramebuffer(GL.FRAMEBUFFER, null); + + //////////////////////TESTESTESTESTE +var vertices = [ + width, height, 0, + 0, height, 0, + width, 0, 0, + 0, 0, 0]; + + vertexBuffer = GL.createBuffer (); + GL.bindBuffer (GL.ARRAY_BUFFER, vertexBuffer); + GL.bufferData (GL.ARRAY_BUFFER, new Float32Array (cast vertices), GL.STATIC_DRAW); + + + var texCoords = [ + 1, 0, + 0, 0, + 1, 1, + 0, 1, + ]; + + texCoordBuffer = GL.createBuffer (); + GL.bindBuffer (GL.ARRAY_BUFFER, texCoordBuffer); + GL.bufferData (GL.ARRAY_BUFFER, new Float32Array (cast texCoords), GL.STATIC_DRAW); + + var vertexShaderSource = + + "attribute vec3 aVertexPosition; + attribute vec2 aTexCoord; + varying vec2 vTexCoord; + + uniform mat4 uModelViewMatrix; + uniform mat4 uProjectionMatrix; + + void main(void) { + vTexCoord = aTexCoord; + gl_Position = uProjectionMatrix * uModelViewMatrix * vec4 (aVertexPosition, 1.0); + }"; + + var vertexShader = GL.createShader (GL.VERTEX_SHADER); + GL.shaderSource (vertexShader, vertexShaderSource); + GL.compileShader (vertexShader); + + if (GL.getShaderParameter (vertexShader, GL.COMPILE_STATUS) == 0) { + + throw "Error compiling vertex shader"; + + } + + + + var fragmentShader = GL.createShader (GL.FRAGMENT_SHADER); + GL.shaderSource (fragmentShader, getFragment()); + GL.compileShader (fragmentShader); + + if (GL.getShaderParameter (fragmentShader, GL.COMPILE_STATUS) == 0) { + + throw "Error compiling fragment shader"; + + } + + shader = GL.createProgram (); + GL.attachShader (shader, vertexShader); + GL.attachShader (shader, fragmentShader); + GL.linkProgram (shader); + + if (GL.getProgramParameter (shader, GL.LINK_STATUS) == 0) { + + throw "Unable to initialize the shader program."; + + } + + vertexAttribute = GL.getAttribLocation (shader, "aVertexPosition"); + texCoordAttribute = GL.getAttribLocation (shader, "aTexCoord"); + projectionMatrixUniform = GL.getUniformLocation (shader, "uProjectionMatrix"); + modelViewMatrixUniform = GL.getUniformLocation (shader, "uModelViewMatrix"); + imageUniform = GL.getUniformLocation (shader, "uImage0"); + getUnifom(); + + + } + public function getFragment():String + { + return ""; + } + + public function getUnifom() + { + + } + public function setUnifom() + { + + } + public function begin() + { + GL.colorMask(true, true, true, true); + GL.viewport(0, 0, width,height); + GL.bindFramebuffer(GL.FRAMEBUFFER, framebuffer); + // GL.clearColor(0, 0, 0, 1); + GL.clear(GL.COLOR_BUFFER_BIT); + } + public function end() + { + GL.bindFramebuffer(GL.FRAMEBUFFER, null); + } + + public function render() + { + GL.useProgram (shader); + GL.enableVertexAttribArray (vertexAttribute); + GL.enableVertexAttribArray (texCoordAttribute); + GL.bindTexture (GL.TEXTURE_2D, texture); + GL.bindBuffer (GL.ARRAY_BUFFER, vertexBuffer); + GL.vertexAttribPointer (vertexAttribute, 3, GL.FLOAT, false, 0, 0); + GL.bindBuffer (GL.ARRAY_BUFFER, texCoordBuffer); + GL.vertexAttribPointer (texCoordAttribute, 2, GL.FLOAT, false, 0, 0); + GL.uniformMatrix3D (projectionMatrixUniform, false, Game.camera.projMatrix); + GL.uniformMatrix3D (modelViewMatrixUniform, false, Game.camera.viewMatrix); + GL.uniform1i (imageUniform, 0); + setUnifom(); + GL.drawArrays (GL.TRIANGLE_STRIP, 0, 4); + + } + public function dispose() + { + GL.deleteProgram(shader); + GL.deleteBuffer(vertexBuffer); + GL.deleteBuffer(texCoordBuffer); + GL.deleteTexture(texture); + } + +} \ No newline at end of file diff --git a/src/com/engine/render/filter/SepiaFilter.hx b/src/com/engine/render/filter/SepiaFilter.hx new file mode 100755 index 0000000..91ef9dc --- /dev/null +++ b/src/com/engine/render/filter/SepiaFilter.hx @@ -0,0 +1,38 @@ +package com.engine.render.filter; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class SepiaFilter extends RenderFilter +{ + + private var sepia:Float = 1; + private var sepiaUniform:GLUniformLocation; + + + override public function getFragment():String + { + return Filter.sepiaFilter; + } + override public function getUnifom() + { + sepiaUniform = GL.getUniformLocation (shader, "sepia"); + } + override public function setUnifom() + { + GL.uniform1f (sepiaUniform, sepia); + } + public function setSepia(f:Float) + { + sepia = f; + + } +} \ No newline at end of file diff --git a/src/com/engine/render/filter/TwistFilter.hx b/src/com/engine/render/filter/TwistFilter.hx new file mode 100755 index 0000000..2893e81 --- /dev/null +++ b/src/com/engine/render/filter/TwistFilter.hx @@ -0,0 +1,60 @@ +package com.engine.render.filter; + + +import flash.geom.Point; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.gl.GLTexture; +import openfl.gl.GLUniformLocation; + +/** + * ... + * @author djoker + */ +class TwistFilter extends RenderFilter +{ +private var radius:Float = 0.5; +private var angle:Float = 5; +private var offsetx:Float = 0.5; +private var offsety:Float=0.5; + +private var radiusUniform:GLUniformLocation; +private var angleUniform:GLUniformLocation; +private var offsetUniform:GLUniformLocation; + + + + override public function getFragment():String + { + return Filter.twistFilter; + } + override public function getUnifom() + { + radiusUniform = GL.getUniformLocation (shader, "radius"); + angleUniform = GL.getUniformLocation (shader, "angle"); + offsetUniform = GL.getUniformLocation (shader, "offset"); + + } + override public function setUnifom() + { + GL.uniform1f (radiusUniform, radius); + GL.uniform1f (angleUniform, angle); + GL.uniform2f(offsetUniform, offsetx, offsety); + } + public function setRadius(v:Float) + { + radius = v; + } + + public function setAngle(v:Float) + { + angle = v; + } + public function setOffset(x:Float,y:Float) + { + offsetx = x; + offsety = y; + } + +} \ No newline at end of file diff --git a/src/com/engine/render/tiles/Layer.hx b/src/com/engine/render/tiles/Layer.hx new file mode 100755 index 0000000..dd27913 --- /dev/null +++ b/src/com/engine/render/tiles/Layer.hx @@ -0,0 +1,228 @@ +package com.engine.render.tiles; + + +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + +import com.engine.render.TileMap; +import com.engine.render.filter.Filter; +import com.engine.render.Clip; +import com.engine.render.Block; + +/** + * ... + * @author djoker + */ +class Layer +{ +public var tilesIDs:Array; +public var tileWidth:Int; +public var tileHeight:Int; +public var name:String; +public var width:Int; +public var height:Int; +public var opacity:Float ; + +public var parent:TileMap; + + private var capacity:Int; + private var numVerts:Int; + private var numIndices:Int; + private var vertices:Float32Array; + private var indices:Int16Array; + private var lastIndexCount:Int; + private var drawing:Bool; + private var currentBatchSize:Int; + private var currentBlendMode:Int; + + public var vertexStrideSize:Int; + +private var vertexBuffer:GLBuffer; +private var indexBuffer:GLBuffer; + + + + + /** + * opacity of the layes + * Map width + * Map height + * tile width + * tile height + */ + + public function new(w:Int,h:Int,tw:Int,th:Int,alpha:Float,name:String) + { + tilesIDs = []; + this.width = w; + this.height = h; + this.tileWidth = tw; + this.tileHeight = th; + this.name = name; + this.opacity = alpha; + + + } + + public function getCell(x:Int, y:Int):Int + { + return tilesIDs[y * this.width + x]; + + } + + public function build() + { + capacity = (this.width * this.height); + vertexStrideSize = 9 * 4; + numVerts = capacity * vertexStrideSize; + numIndices = capacity * 6; + vertices = new Float32Array(numVerts); + this.indices = new Int16Array(numIndices); + var length = Std.int(this.indices.length/6); + + for (i in 0...length) + { + var index2 = i * 6; + var index3 = i * 4; + this.indices[index2 + 0] = index3 + 0; + this.indices[index2 + 1] = index3 + 1; + this.indices[index2 + 2] = index3 + 2; + this.indices[index2 + 3] = index3 + 0; + this.indices[index2 + 4] = index3 + 2; + this.indices[index2 + 5] = index3 + 3; + }; + + + + currentBatchSize = 0; + + for (y in 0...height) + { + for (x in 0...width) + { + + + var id = getCell(x, y); + if (id >= 1) + { + //id = 1; + var t:Clip = parent.getClip(id - 1); + var DrawX:Int =Math.round((x * tileWidth)); + var DrawY:Int =Math.round((y * tileHeight)); + var dst:Clip = new Clip(DrawX,DrawY, tileWidth, tileHeight); + addQuad(t,dst); + } + } + } + + + + vertexBuffer = GL.createBuffer(); + indexBuffer = GL.createBuffer(); + + + //upload the index data + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer); + GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indices, GL.STATIC_DRAW); + GL.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer); + GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + + vertices = null; + indices = null; +} + +public function addQuad(srcrect:Clip, dstrect:Clip) +{ + +var index:Int = currentBatchSize * vertexStrideSize; + +var widthTex:Int = parent.image.width; +var heightTex:Int = parent.image.height; + + + + +vertices[index++] = dstrect.x; +vertices[index++] = dstrect.y; +vertices[index++] = 0; +vertices[index++] = srcrect.x / widthTex; vertices[index++] = srcrect.y / heightTex; +vertices[index++] = 1;vertices[index++] = 1;vertices[index++] = 1;vertices[index++] = opacity; + +vertices[index++] = (dstrect.x + dstrect.width); +vertices[index++] = dstrect.y; +vertices[index++] = 0; +vertices[index++] = (srcrect.x + srcrect.width) / widthTex;vertices[index++] = srcrect.y / heightTex; +vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = opacity; + +vertices[index++] =(dstrect.x + dstrect.width); +vertices[index++] =(dstrect.y + dstrect.height); +vertices[index++] = 0; +vertices[index++] = (srcrect.x + srcrect.width) / widthTex;vertices[index++] = (srcrect.y + srcrect.height) / heightTex; +vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = opacity; + +vertices[index++] = dstrect.x; +vertices[index++] = (dstrect.y + dstrect.height); +vertices[index++] = 0; +vertices[index++] = srcrect.x / widthTex; vertices[index++] = (srcrect.y + srcrect.height) / heightTex; +vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = 1; vertices[index++] = opacity; + + + + +this.currentBatchSize++; + +} +public function render() + { + if (currentBatchSize == 0) return; + GL.bindBuffer(GL.ARRAY_BUFFER, this.vertexBuffer); + GL.vertexAttribPointer(Filter.vertexAttribute, 3, GL.FLOAT, false, vertexStrideSize, 0); + GL.vertexAttribPointer(Filter.texCoordAttribute , 2, GL.FLOAT, false, vertexStrideSize, 3 * 4); + GL.vertexAttribPointer(Filter.colorAttribute, 4, GL.FLOAT, false, vertexStrideSize, (3+2) * 4); + // GL.bufferData(GL.ARRAY_BUFFER, vertices, GL.STATIC_DRAW); + GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + GL.drawElements(GL.TRIANGLES, currentBatchSize * 6, GL.UNSIGNED_SHORT, 0); + } + + +public function dispose():Void +{ + GL.deleteBuffer(indexBuffer); + GL.deleteBuffer(vertexBuffer); + tilesIDs = null; +} + +public function toCSV(?w:Int):String +{ + var counter:Int = 0; + var csv:String = ""; + + for (tile in tilesIDs) + { + var tileGID = tile; + + if (counter >= width) + { + // remove the last "," + csv = csv.substr(0, csv.length - 1); + + // add a new line and reset counter + csv += '\n'; + counter = 0; + } + + csv += tileGID; + csv += ','; + + counter++; + } + + // remove the last "," + csv = csv.substr(0, csv.length - 1); + + return csv; + } +} \ No newline at end of file diff --git a/src/com/engine/render/tiles/LayerCache.hx b/src/com/engine/render/tiles/LayerCache.hx new file mode 100755 index 0000000..2ff3959 --- /dev/null +++ b/src/com/engine/render/tiles/LayerCache.hx @@ -0,0 +1,270 @@ +package com.engine.render.tiles; + +import flash.geom.Rectangle; +import flash.geom.Vector3D; + +import com.engine.render.BatchPrimitives; +import openfl.gl.GL; +import openfl.gl.GLBuffer; +import openfl.gl.GLProgram; +import openfl.utils.Float32Array; +import openfl.utils.Int16Array; + +import com.engine.game.Game; +import com.engine.render.TileMapCache; +import com.engine.render.filter.Filter; +import com.engine.render.Clip; +import com.engine.render.Block; +import com.engine.misc.Util; + +/** + * ... + * @author djoker + */ +class LayerCache +{ +public var tilesIDs:Array; +public var tileWidth:Int; +public var tileHeight:Int; +public var name:String; +public var width:Int; +public var height:Int; +public var opacity:Float ; + + public var parent:TileMapCache; + private var blocks:Array; + private var segmentCols:Int ; + private var segmentRows:Int ; + private var numSegments:Int ; + private var segmentWidth:Int; + private var segmentHeight:Int ; + public var drawBlocks:Int; + + + + + /** + * opacity of the layes + * Map width + * Map height + * tile width + * tile height + */ + + public function new(w:Int,h:Int,tw:Int,th:Int,alpha:Float,name:String) + { + tilesIDs = []; + this.width = w; + this.height = h; + this.tileWidth = tw; + this.tileHeight = th; + this.name = name; + this.opacity = alpha; + } + + + +public function buildSegments(segmentWidth:Int,segmentHeight:Int) +{ + +segmentCols = 0; +segmentRows = 0; +numSegments = 0; +this.segmentWidth = Std.int(Game.viewWidth / tileWidth); +this.segmentHeight = Std.int(Game.viewHeight / tileHeight); + + + + + blocks = new Array(); + + + var tilesetCols:Int = Math.floor(parent.image.width / tileWidth); + var tilesetRows:Int = Math.floor(parent.image.height / tileHeight); + + var viewWidthInTiles:Int = Std.int(Game.viewWidth/ tileWidth); + var viewHeightInTiles:Int = Std.int(Game.viewHeight/ tileHeight); + + + var cols:Int = width; + var rows:Int = height; + + + segmentWidth = segmentWidth == -1 ? (cols < viewWidthInTiles * 2 ? cols : viewWidthInTiles) : segmentWidth; + segmentHeight = segmentHeight == -1 ? (rows < viewHeightInTiles * 2 ? rows : viewHeightInTiles) : segmentHeight; + segmentCols = Math.ceil(cols / segmentWidth); + segmentRows = Math.ceil(rows / segmentHeight); + + for (y in 0...segmentCols) + { + for (x in 0...segmentRows) + { + var sw:Int = x == segmentCols - 1 && cols % segmentWidth != 0 ? cols % segmentWidth : segmentWidth; + var sh:Int = y == segmentRows - 1 && rows % segmentHeight != 0 ? rows % segmentHeight : segmentHeight; + blocks.push(new Block(sw, sh)); + numSegments++; + } + } + + + + var tid:Int = 0; + var index:Int=0; + + for (y in 0...rows) + { + for (x in 0...cols) + { + + var segmentRow:Int = Std.int(y / segmentHeight); + var segmentCol:Int = Std.int(x / segmentWidth); + var segmentOffset:Int = segmentRow * segmentCols + segmentCol; + var segment:Block = blocks[segmentOffset]; + + tid = getCell(x, y); + if (tid == 0) + { + continue; + } + tid -= 1; + + + var tx:Int = Math.round(x * tileWidth); + var ty:Int = Math.round(y * tileHeight); + + var widthTex:Int = parent.image.width; + var heightTex:Int = parent.image.height; + + + + var clip:Clip = parent.getClip(tid); + + var u:Float = clip.x / widthTex; + var u2:Float = (clip.x + clip.width) / widthTex; + var v:Float = clip.y / heightTex; + var v2:Float=(clip.y + clip.height) / heightTex; + + + + + + segment.addVertex(tx + Util.EPSILON, ty + Util.EPSILON, u, v); + segment.addVertex(tx + tileWidth, ty + Util.EPSILON, u2, v); + segment.addVertex(tx + Util.EPSILON, ty + tileHeight, u, v2); + segment.addVertex(tx + tileWidth, ty + tileHeight, u2, v2); + + segment.indices.push(segment.index + 0); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 1); + segment.indices.push(segment.index + 2); + segment.indices.push(segment.index + 3); + + + + segment.index += 4; + + } + } + + + + for (i in 0...blocks.length) + { + blocks[i].build(); + } +} + public function getCell(x:Int, y:Int):Int + { + return tilesIDs[y * this.width + x]; + + } + public function setCell(x:Int, y:Int,v:Int) + { + tilesIDs[y * this.width + x]=v; + + } + +public function renderAABB(batch:BatchPrimitives) +{ +for (i in 0...blocks.length) + { + + /* + batch.line(blocks[i].vMin.x, blocks[i].vMin.y, blocks[i].vMax.x, blocks[i].vMin.y, 0, 1, 1, 1); + batch.line(blocks[i].vMax.x, blocks[i].vMax.y, blocks[i].vMax.x, blocks[i].vMax.y, 0, 1, 1, 1); + batch.line(blocks[i].vMin.x, blocks[i].vMin.y, blocks[i].vMin.x, blocks[i].vMax.y, 0, 1, 1, 1); + batch.line(blocks[i].vMax.x, blocks[i].vMin.y, blocks[i].vMax.x, blocks[i].vMax.y, 0, 1, 1, 1); +*/ + + batch.line(blocks[i].AMin.x, blocks[i].AMin.y, blocks[i].AMax.x, blocks[i].AMin.y, 0, 1, 1, 1); + batch.line(blocks[i].AMax.x, blocks[i].AMax.y, blocks[i].AMax.x, blocks[i].AMax.y, 0, 1, 1, 1); + batch.line(blocks[i].AMin.x, blocks[i].AMin.y, blocks[i].AMin.x, blocks[i].AMax.y, 0, 1, 1, 1); + batch.line(blocks[i].AMax.x, blocks[i].AMin.y, blocks[i].AMax.x, blocks[i].AMax.y, 0, 1, 1, 1); + + } + + +} + + + +public function renderSegments() +{ + drawBlocks = 0; + for (i in 0...blocks.length) + { + blocks[i].AMin = parent.viewMatrix.transformVector(blocks[i].vMin); + blocks[i].AMax = parent.viewMatrix.transformVector(blocks[i].vMax); + blocks[i].bound = new Rectangle(blocks[i].AMin.x, blocks[i].AMin.y, blocks[i].AMax.x - blocks[i].AMin.x, blocks[i].AMax.y - blocks[i].AMin.y); + + if (parent.viewBound.intersects(blocks[i].bound)) + { + blocks[i].render(); + drawBlocks++; + } + } +} + + +public function dispose():Void +{ + tilesIDs = null; + for (i in 0...blocks.length) + { + blocks[i].dispose(); + } + +} + +public function toCSV(?w:Int):String +{ + var counter:Int = 0; + var csv:String = ""; + + for (tile in tilesIDs) + { + var tileGID = tile; + + if (counter >= width) + { + // remove the last "," + csv = csv.substr(0, csv.length - 1); + + // add a new line and reset counter + csv += '\n'; + counter = 0; + } + + csv += tileGID; + csv += ','; + + counter++; + } + + // remove the last "," + csv = csv.substr(0, csv.length - 1); + + return csv; + } +} \ No newline at end of file diff --git a/src/com/engine/game/Text.hx b/src/com/engine/ui/Text.hx similarity index 71% rename from src/com/engine/game/Text.hx rename to src/com/engine/ui/Text.hx index 4b7e771..6d528e1 100755 --- a/src/com/engine/game/Text.hx +++ b/src/com/engine/ui/Text.hx @@ -1,4 +1,4 @@ -package com.engine.game; +package com.engine.ui; import flash.text.TextField; import flash.text.TextFormat; @@ -16,8 +16,9 @@ class Text extends TextField super (); this.x = x; this.y = y; + width = caption.length * size; selectable = false; - defaultTextFormat = new TextFormat ("_sans", size, color); + defaultTextFormat = new TextFormat ("arial", size, color); text = caption; }